/** UserManager::handleQuit handle quits (ie delete the class) */ void UserManager::handleQuit(nstring::str &uid) { nstring::str nick; getNickFromId(uid, nick); // get nickname from uid. irc::nhash::iterator i = uidMap.find(uid); irc::user_hash::iterator it = users.find(nick); if (i != uidMap.end() && it != users.end()) { nstring::str server = instance->ircdProtocol->getServerFromId(it->second->server); instance->log(MISC, "handleQuit(): " + it->second->nick + "!" + it->second->ident + "@" + it->second->host + " has disconnected from " + server); //instance->log(LOGCHAN, "// TODO"); // log things, ie LOGCHAN and NETWORK delete it->second; users.erase(it); uidMap.erase(i); // remove the user return; // we're done, bail! } // user deleted instance->log(ERROR, "handleQuit(): Cannot find the user in user map, this will possibly cause a leak!"); // log a few things here FOREACH_MODULE(instance, &Module::onQuit, nick); }
/** UserManager::handleNick handle nick, renames our nick in users and uidMap */ void UserManager::handleNick(nstring::str &uid, nstring::str &nick) { User* userHolder = NULL; nstring::str userNick; getNickFromId(uid, userNick); // get the class from users irc::user_hash::iterator it = users.find(userNick); irc::nhash::iterator i = uidMap.find(uid); // find uid maps instance->log(MISC, "handleNick(): " + it->second->nick + "!" + it->second->ident + "@" + it->second->host + " changed nick to " + nick); //instance->log(LOGCHAN, "// TODO"); // log things, ie LOGCHAN and NETWORK userHolder = it->second; i->second = nick; userHolder->oldNick = userHolder->nick; userHolder->nick = nick; users.insert(std::pair<nstring::str, User*>(nick, userHolder)); users.erase(it); // update some info FOREACH_MODULE(instance, &Module::onNick, userNick, nick); }
/* Get the number of available panels. * * On success, the total number of available panels is returned . */ static int num_panels (void) { size_t idx = 0, npanels = 0; FOREACH_MODULE (idx, module_list) npanels++; return npanels; }
/** ChannelManager::handleTopic handle TOPIC */ void ChannelManager::handleTopic(nstring::str &nick, nstring::str &chan, nstring::str &topic) { Channel* channel = getChannel(chan); // get channel channel->topic = topic; channel->topicSetter = nick; instance->log(MISC, "handleTopic(): " + nick + " has changed the topic for " + chan + " to (" + topic + ")"); // log things, ie NETWORK FOREACH_MODULE(instance, &Module::onTopic, nick, chan, topic); }
/** UserManager::handleConnect handle incoming users */ void UserManager::handleConnect(nstring::str &nick, nstring::str &ident, nstring::str &host, nstring::str &ip, nstring::str &nickTS, nstring::str &uid, nstring::str &sid, nstring::str &gecos) { users.insert(std::pair<nstring::str, User*>(nick, new User(uid, nick, ident, host, ip, gecos, sid, nickTS))); uidMap.insert(std::pair<nstring::str, nstring::str>(uid, nick)); // insert user into uid map so we can find it easily nstring::str server = instance->ircdProtocol->getServerFromId(sid); instance->log(MISC, "handleConnect(): " + nick + "!" + ident + "@" + host + " (" + uid + ") has connected to " + server); //instance->log(LOGCHAN, "// TODO"); // log things, ie LOGCHAN and NETWORK FOREACH_MODULE(instance, &Module::onConnect, nick, uid, ident, host, ip); }
/** ChannelManager::handleMode handle TMODE changes, etc. */ void ChannelManager::handleMode(nstring::str &uid, nstring::str &chan, nstring::str &modes) { irc::modes modeContainer; irc::params paramContainer; instance->modeParser->sortModes(modes, modeContainer, paramContainer, true); // parse modes Channel* channel = getChannel(chan); instance->modeParser->saveModes(channel, modeContainer, paramContainer); // update the modes in our channel record FOREACH_MODULE(instance, &Module::onCMode, chan, modeContainer, paramContainer); // TODO }
/** UserManager::handleOper handle oper ups (mode = true/false) */ void UserManager::handleOper(nstring::str &uid, bool mode) { nstring::str nick; getNickFromId(uid, nick); User* userHolder = getUser(nick); userHolder->oper = mode; // set oper to mode //instance->log(MISC, "handleConnect(): " + nick + "!" + ident + "@" + host + " has connected to " + sid); //instance->log(LOGCHAN, "// TODO"); // log things, ie LOGCHAN and NETWORK FOREACH_MODULE(instance, &Module::onOper, nick, mode); }
/** ChannelManager::handleCreate handle SJOINS or FJOIN w/e */ void ChannelManager::handleCreate(nstring::str &chan, nstring::str &ts, nstring::str &modes, std::vector<nstring::str> &users) { Channel* channel = NULL; irc::chan_hash::iterator it = chans.find(chan); irc::nhash parsedUsers = parseUsers(users); irc::nhash oldUsers; // parse up users if (it == chans.end()) { channel = new Channel(chan, ts); chans.insert(std::pair<nstring::str, Channel*>(chan, channel)); channel->users.insert(parsedUsers.begin(), parsedUsers.end()); instance->log(MISC, "handleCreate(): " + chan + " has been created with a timestamp of " + ts); // log things, ie MISC } else { channel = getChannel(chan); channel->users.insert(parsedUsers.begin(), parsedUsers.end()); // set some vars in our Channel* } if (!modes.empty()) { irc::modes modeContainer; irc::params paramContainer; instance->modeParser->sortModes(modes, modeContainer, paramContainer, true); instance->modeParser->saveModes(channel, modeContainer, paramContainer); } // parse modes and save modes.. User* user = NULL; nstring::str tempNick; for (irc::nhash::iterator pit = channel->users.begin(); pit != channel->users.end(); ++pit) { tempNick = pit->first; user = instance->userManager->getUser(tempNick); user->qChans.push_back(chan); // get the nick & channel } // for channel->users and update the user's qChan vector FOREACH_MODULE(instance, &Module::onChanCreate, chan, parsedUsers); // on chan create }
/** ChannelManager::handleJoin handle JOINS */ void ChannelManager::handleJoin(nstring::str &uid, nstring::str &ts, nstring::str &chan) { Channel* channel = getChannel(chan); nstring::str nick; instance->userManager->getNickFromId(uid, nick); User* user = instance->userManager->getUser(nick); // get the nick & channel user->qChans.push_back(chan); channel->users.insert(std::pair<nstring::str, nstring::str>(nick, "")); instance->log(MISC, "handleJoin(): " + nick + " has joined " + chan); // log things, ie MISC FOREACH_MODULE(instance, &Module::onJoin, nick, chan); }
/** UserManager::handleHost handle host changes, typically CHGHOST */ void UserManager::handleHost(nstring::str &uid, nstring::str &host) { nstring::str userNick; getNickFromId(uid, userNick); // get the class from users irc::user_hash::iterator it = users.find(userNick); // find uid maps instance->log(MISC, "handleHost(): " + it->second->nick + "!" + it->second->ident + "@" + it->second->host + " changed hostname to " + host); //instance->log(LOGCHAN, "// TODO"); // log things, ie LOGCHAN and NETWORK it->second->oldHost = it->second->host; it->second->host = host; // update host name FOREACH_MODULE(instance, &Module::onHostChange, userNick, host); }
/** ChannelManager::handleKick handle KICK */ void ChannelManager::handleKick(nstring::str &uid, nstring::str &chan, nstring::str &who) { irc::chan_hash::iterator i = chans.find(chan); nstring::str nick, whonick; std::vector<nstring::str>::iterator qit; instance->userManager->getNickFromId(uid, nick); instance->userManager->getNickFromId(who, whonick); User* user = instance->userManager->getUser(whonick); // get the nick & channel irc::nhash::iterator it = i->second->users.find(whonick); if (it == i->second->users.end()) { instance->log(ERROR, "handleKick(): trying to find user in channel map on part, can't find user!"); return; } // can't find user in channel->users. major issue? i->second->users.erase(it); if (i->second->users.empty()) { delete i->second; chans.erase(i); } // remove the user from our internal channel->users array, ALSO // check if our internal array matches 0, if it does the channel // is empty so delete it. qit = std::find(user->qChans.begin(), user->qChans.end(), chan); if (qit != user->qChans.end()) user->qChans.erase(qit); // the user struct also contains a method to quickly see what channels a user is in // compared to searching every channel, AND every user array at the same time. instance->log(MISC, "handleKick(): " + whonick + " has been kicked from " + chan + " by " + nick); // log things, ie MISC FOREACH_MODULE(instance, &Module::onKick, nick, whonick, chan); }
/** UserManager::handleMode handle mode changes */ void UserManager::handleMode(nstring::str &uid, nstring::str &modes) { irc::modes modeContainer; irc::params paramContainer; instance->modeParser->sortModes(modes, modeContainer, paramContainer, false); // parse modes nstring::str nick; getNickFromId(uid, nick); User* user = getUser(nick); instance->modeParser->saveModes(user, modeContainer); // update the modes in our user record if (modeContainer["plus"].find('o') != std::string::npos) handleOper(uid, true); // check if we have an "+o", if we do call handleOper() if (modeContainer["minus"].find('o') != std::string::npos) handleOper(uid, false); // check if we have a "-o", if we do again call handleOper() FOREACH_MODULE(instance, &Module::onUMode, nick, modeContainer); }