bool MessageManager::isIgnoredOrFiltered(const ChatMessagePtr& msg, Client* aClient, bool PM){ const auto& identity = msg->getFrom()->getIdentity(); auto logIgnored = [&](bool filter) -> void { if (SETTING(LOG_IGNORED)) { string tmp; if (PM) { tmp = filter ? STRING(PM_MESSAGE_FILTERED) : STRING(PM_MESSAGE_IGNORED); } else { string hub = "[" + ((aClient && !aClient->getHubName().empty()) ? (aClient->getHubName().size() > 50 ? (aClient->getHubName().substr(0, 50) + "...") : aClient->getHubName()) : aClient->getHubUrl()) + "] "; tmp = (filter ? STRING(MC_MESSAGE_FILTERED) : STRING(MC_MESSAGE_IGNORED)) + hub; } tmp += "<" + identity.getNick() + "> " + msg->getText(); LogManager::getInstance()->message(tmp, LogMessage::SEV_INFO); } }; if (msg->getFrom()->getUser()->isIgnored() && ((aClient && aClient->isOp()) || !identity.isOp() || identity.isBot())) { logIgnored(false); return true; } if (isChatFiltered(identity.getNick(), msg->getText(), PM ? ChatFilterItem::PM : ChatFilterItem::MC)) { logIgnored(true); return true; } return false; }
json Serializer::serializeChatMessage(const ChatMessagePtr& aMessage) noexcept { json ret = { { "id", aMessage->getId()}, { "text", aMessage->getText() }, { "from", serializeOnlineUser(aMessage->getFrom()) }, { "time", aMessage->getTime() }, { "is_read", aMessage->getRead() } }; if (aMessage->getTo()) { ret["to"] = serializeOnlineUser(aMessage->getTo()); } if (aMessage->getReplyTo()) { ret["reply_to"] = serializeOnlineUser(aMessage->getReplyTo()); } return ret; }
void Client::onChatMessage(const ChatMessagePtr& aMessage) noexcept { if (MessageManager::getInstance()->isIgnoredOrFiltered(aMessage, this, false)) return; if (get(HubSettings::LogMainChat)) { ParamMap params; params["message"] = aMessage->format(); getHubIdentity().getParams(params, "hub", false); params["hubURL"] = getHubUrl(); getMyIdentity().getParams(params, "my", true); LOG(LogManager::CHAT, params); } cache.addMessage(aMessage); fire(ClientListener::ChatMessage(), this, aMessage); }
void MessageManager::onPrivateMessage(const ChatMessagePtr& aMessage) { bool myPM = aMessage->getReplyTo()->getUser() == ClientManager::getInstance()->getMe(); const UserPtr& user = myPM ? aMessage->getTo()->getUser() : aMessage->getReplyTo()->getUser(); size_t wndCnt; { WLock l(cs); wndCnt = chats.size(); auto i = chats.find(user); if (i != chats.end()) { i->second->handleMessage(aMessage); //We should have a listener in the frame return; } } auto c = aMessage->getFrom()->getClient(); if (wndCnt > 200 || (!myPM && isIgnoredOrFiltered(aMessage, c.get(), true))) { DisconnectCCPM(user); return; } const auto& identity = aMessage->getReplyTo()->getIdentity(); if ((identity.isBot() && !SETTING(POPUP_BOT_PMS)) || (identity.isHub() && !SETTING(POPUP_HUB_PMS))) { c->Message(STRING(PRIVATE_MESSAGE_FROM) + " " + identity.getNick() + ": " + aMessage->format()); return; } auto chat = addChat(HintedUser(user, aMessage->getReplyTo()->getClient()->getHubUrl()), true); chat->handleMessage(aMessage); if (AirUtil::getAway() && (!SETTING(NO_AWAYMSG_TO_BOTS) || !user->isSet(User::BOT))) { ParamMap params; aMessage->getFrom()->getIdentity().getParams(params, "user", false); string error; chat->sendMessage(AirUtil::getAwayMessage(c->get(HubSettings::AwayMsg), params), error, false); } }