-extern serverstats* stats;
-
-void handle_join(char **parameters, int pcnt, userrec *user)
-{
- chanrec* Ptr;
-
- if (loop_call(handle_join,parameters,pcnt,user,0,0,1))
- return;
- if (parameters[0][0] == '#')
- {
- Ptr = add_channel(user,parameters[0],parameters[1],false);
- }
-}
-
-
-void handle_part(char **parameters, int pcnt, userrec *user)
-{
- if (pcnt > 1)
- {
- if (loop_call(handle_part,parameters,pcnt,user,0,pcnt-2,0))
- return;
- del_channel(user,parameters[0],parameters[1],false);
- }
- else
- {
- if (loop_call(handle_part,parameters,pcnt,user,0,pcnt-1,0))
- return;
- del_channel(user,parameters[0],NULL,false);
- }
-}
-
-void handle_commands(char **parameters, int pcnt, userrec *user)
-{
- for (unsigned int i = 0; i < cmdlist.size(); i++)
- {
- WriteServ(user->fd,"902 %s :%s %s %d",user->nick,cmdlist[i].command,cmdlist[i].source,cmdlist[i].min_params);
- }
- WriteServ(user->fd,"903 %s :End of COMMANDS list",user->nick);
-}
-
-void handle_kick(char **parameters, int pcnt, userrec *user)
-{
- chanrec* Ptr = FindChan(parameters[0]);
- userrec* u = Find(parameters[1]);
-
- if ((!u) || (!Ptr))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- return;
- }
-
- if ((!has_channel(user,Ptr)) && (!is_uline(user->server)))
- {
- WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, parameters[0]);
- return;
- }
-
- char reason[MAXBUF];
-
- if (pcnt > 2)
- {
- strlcpy(reason,parameters[2],MAXBUF);
- if (strlen(reason)>MAXKICK)
- {
- reason[MAXKICK-1] = '\0';
- }
-
- kick_channel(user,u,Ptr,reason);
- }
- else
- {
- strlcpy(reason,user->nick,MAXBUF);
- kick_channel(user,u,Ptr,reason);
- }
-
-}
-
-void handle_loadmodule(char **parameters, int pcnt, userrec *user)
-{
- if (LoadModule(parameters[0]))
- {
- WriteOpers("*** NEW MODULE: %s",parameters[0]);
- WriteServ(user->fd,"975 %s %s :Module successfully loaded.",user->nick, parameters[0]);
- }
- else
- {
- WriteServ(user->fd,"974 %s %s :Failed to load module: %s",user->nick, parameters[0],ModuleError());
- }
-}
-
-void handle_unloadmodule(char **parameters, int pcnt, userrec *user)
-{
- if (UnloadModule(parameters[0]))
- {
- WriteOpers("*** MODULE UNLOADED: %s",parameters[0]);
- WriteServ(user->fd,"973 %s %s :Module successfully unloaded.",user->nick, parameters[0]);
- }
- else
- {
- WriteServ(user->fd,"972 %s %s :Failed to unload module: %s",user->nick, parameters[0],ModuleError());
- }
-}
-
-void handle_die(char **parameters, int pcnt, userrec *user)
-{
- log(DEBUG,"die: %s",user->nick);
- if (!strcmp(parameters[0],Config->diepass))
- {
- WriteOpers("*** DIE command from %s!%s@%s, terminating...",user->nick,user->ident,user->host);
- sleep(Config->DieDelay);
- Exit(ERROR);
- }
- else
- {
- WriteOpers("*** Failed DIE Command from %s!%s@%s.",user->nick,user->ident,user->host);
- }
-}
-
-void handle_restart(char **parameters, int pcnt, userrec *user)
-{
- char *argv[32];
- log(DEFAULT,"Restart: %s",user->nick);
- if (!strcmp(parameters[0],Config->restartpass))
- {
- WriteOpers("*** RESTART command from %s!%s@%s, restarting server.",user->nick,user->ident,user->host);
-
- argv[0] = Config->MyExecutable;
- argv[1] = "-wait";
- if (Config->nofork)
- {
- argv[2] = "-nofork";
- }
- else
- {
- argv[2] = NULL;
- }
- argv[3] = NULL;
-
- // close ALL file descriptors
- send_error("Server restarting.");
- sleep(1);
- for (int i = 0; i < 65536; i++)
- {
- shutdown(i,2);
- close(i);
- }
- sleep(2);
-
- execv(Config->MyExecutable,argv);
-
- exit(0);
- }
- else
- {
- WriteOpers("*** Failed RESTART Command from %s!%s@%s.",user->nick,user->ident,user->host);
- }
-}
-
-void handle_kill(char **parameters, int pcnt, userrec *user)
-{
- userrec *u = Find(parameters[0]);
- char killreason[MAXBUF];
-
- log(DEBUG,"kill: %s %s",parameters[0],parameters[1]);
- if (u)
- {
- log(DEBUG,"into kill mechanism");
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnKill(user,u,parameters[1]));
- if (MOD_RESULT) {
- log(DEBUG,"A module prevented the kill with result %d",MOD_RESULT);
- return;
- }
-
- if (u->fd < 0)
- {
- // remote kill
- WriteOpers("*** Remote kill by %s: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
- snprintf(killreason,MAXBUF,"[%s] Killed (%s (%s))",Config->ServerName,user->nick,parameters[1]);
- WriteCommonExcept(u,"QUIT :%s",killreason);
-
- FOREACH_MOD OnRemoteKill(user,u,killreason);
-
- user_hash::iterator iter = clientlist.find(u->nick);
- if (iter != clientlist.end())
- {
- log(DEBUG,"deleting user hash value %d",iter->second);
- clientlist.erase(iter);
- }
- if (u->registered == 7)
- {
- purge_empty_chans(u);
- }
- if (u->fd > -1)
- fd_ref_table[u->fd] = NULL;
- delete u;
- }
- else
- {
- // local kill
- log(DEFAULT,"LOCAL KILL: %s :%s!%s!%s (%s)", u->nick, Config->ServerName,user->dhost,user->nick,parameters[1]);
- WriteTo(user, u, "KILL %s :%s!%s!%s (%s)", u->nick, Config->ServerName,user->dhost,user->nick,parameters[1]);
- WriteOpers("*** Local Kill by %s: %s!%s@%s (%s)",user->nick,u->nick,u->ident,u->host,parameters[1]);
- snprintf(killreason,MAXBUF,"Killed (%s (%s))",user->nick,parameters[1]);
- kill_link(u,killreason);
- }
- }
- else
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
-}
-
-void handle_summon(char **parameters, int pcnt, userrec *user)
-{
- WriteServ(user->fd,"445 %s :SUMMON has been disabled (depreciated command)",user->nick);
-}
-
-void handle_users(char **parameters, int pcnt, userrec *user)
-{
- WriteServ(user->fd,"445 %s :USERS has been disabled (depreciated command)",user->nick);
-}
-
-void handle_pass(char **parameters, int pcnt, userrec *user)
-{
- // Check to make sure they havnt registered -- Fix by FCS
- if (user->registered == 7)
- {
- WriteServ(user->fd,"462 %s :You may not reregister",user->nick);
- return;
- }
- strlcpy(user->password,parameters[0],MAXBUF);
- if (!strcasecmp(parameters[0],Passwd(user)))
- {
- user->haspassed = true;
- }
-}
-
-void handle_invite(char **parameters, int pcnt, userrec *user)
-{
- if (pcnt == 2)
- {
- userrec* u = Find(parameters[0]);
- chanrec* c = FindChan(parameters[1]);
-
- if ((!c) || (!u))
- {
- if (!c)
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[1]);
- }
- else
- {
- if (c->binarymodes & CM_INVITEONLY)
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
- }
-
- return;
- }
-
- if (c->binarymodes & CM_INVITEONLY)
- {
- if (cstatus(user,c) < STATUS_HOP)
- {
- WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel",user->nick, c->name);
- return;
- }
- }
- if (has_channel(u,c))
- {
- WriteServ(user->fd,"443 %s %s %s :Is already on channel %s",user->nick,u->nick,c->name,c->name);
- return;
- }
- if (!has_channel(user,c))
- {
- WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, c->name);
- return;
- }
-
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnUserPreInvite(user,u,c));
- if (MOD_RESULT == 1) {
- return;
- }
-
- u->InviteTo(c->name);
- WriteFrom(u->fd,user,"INVITE %s :%s",u->nick,c->name);
- WriteServ(user->fd,"341 %s %s %s",user->nick,u->nick,c->name);
- FOREACH_MOD OnUserInvite(user,u,c);
- }
- else
- {
- // pinched from ircu - invite with not enough parameters shows channels
- // youve been invited to but haven't joined yet.
- InvitedList* il = user->GetInviteList();
- for (InvitedList::iterator i = il->begin(); i != il->end(); i++)
- {
- if (i->channel) {
- WriteServ(user->fd,"346 %s :%s",user->nick,i->channel);
- }
- }
- WriteServ(user->fd,"347 %s :End of INVITE list",user->nick);
- }
-}
-
-void handle_topic(char **parameters, int pcnt, userrec *user)
-{
- chanrec* Ptr;
-
- if (pcnt == 1)
- {
- if (strlen(parameters[0]) <= CHANMAX)
- {
- Ptr = FindChan(parameters[0]);
- if (Ptr)
- {
- if (((Ptr) && (!has_channel(user,Ptr))) && (Ptr->binarymodes & CM_SECRET))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, Ptr->name);
- return;
- }
- if (Ptr->topicset)
- {
- WriteServ(user->fd,"332 %s %s :%s", user->nick, Ptr->name, Ptr->topic);
- WriteServ(user->fd,"333 %s %s %s %d", user->nick, Ptr->name, Ptr->setby, Ptr->topicset);
- }
- else
- {
- WriteServ(user->fd,"331 %s %s :No topic is set.", user->nick, Ptr->name);
- }
- }
- else
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
- }
- return;
- }
- else if (pcnt>1)
- {
- if (strlen(parameters[0]) <= CHANMAX)
- {
- Ptr = FindChan(parameters[0]);
- if (Ptr)
- {
- if ((Ptr) && (!has_channel(user,Ptr)))
- {
- WriteServ(user->fd,"442 %s %s :You're not on that channel!",user->nick, Ptr->name);
- return;
- }
- if ((Ptr->binarymodes & CM_TOPICLOCK) && (cstatus(user,Ptr)<STATUS_HOP))
- {
- WriteServ(user->fd,"482 %s %s :You must be at least a half-operator to change modes on this channel", user->nick, Ptr->name);
- return;
- }
-
- char topic[MAXBUF];
- strlcpy(topic,parameters[1],MAXBUF);
- if (strlen(topic)>MAXTOPIC)
- {
- topic[MAXTOPIC] = '\0';
- }
-
- if (user->fd > -1)
- {
- int MOD_RESULT = 0;
- FOREACH_RESULT(OnLocalTopicChange(user,Ptr,topic));
- if (MOD_RESULT)
- return;
- }
-
- strlcpy(Ptr->topic,topic,MAXTOPIC);
- strlcpy(Ptr->setby,user->nick,NICKMAX);
- Ptr->topicset = TIME;
- WriteChannel(Ptr,user,"TOPIC %s :%s",Ptr->name, Ptr->topic);
- if (user->fd > -1)
- {
- FOREACH_MOD OnPostLocalTopicChange(user,Ptr,topic);
- }
- }
- else
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
- }
- }
-}
-
-void handle_names(char **parameters, int pcnt, userrec *user)
-{
- chanrec* c;
-
- if (!pcnt)
- {
- WriteServ(user->fd,"366 %s * :End of /NAMES list.",user->nick);
- return;
- }
-
- if (loop_call(handle_names,parameters,pcnt,user,0,pcnt-1,0))
- return;
- c = FindChan(parameters[0]);
- if (c)
- {
- if (((c) && (!has_channel(user,c))) && (c->binarymodes & CM_SECRET))
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, c->name);
- return;
- }
- userlist(user,c);
- WriteServ(user->fd,"366 %s %s :End of /NAMES list.", user->nick, c->name);
- }
- else
- {
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
-}
-
-void handle_privmsg(char **parameters, int pcnt, userrec *user)
-{
- userrec *dest;
- chanrec *chan;
-
- user->idle_lastmsg = TIME;
-
- if (loop_call(handle_privmsg,parameters,pcnt,user,0,pcnt-2,0))
- return;
- if (parameters[0][0] == '$')
- {
- // notice to server mask
- char* servermask = parameters[0];
- servermask++;
- if (match(Config->ServerName,servermask))
- {
- ServerPrivmsgAll("%s",parameters[1]);
- }
- return;
- }
- else if (parameters[0][0] == '#')
- {
- chan = FindChan(parameters[0]);
- if (chan)
- {
- if ((chan->binarymodes & CM_NOEXTERNAL) && (!has_channel(user,chan)))
- {
- WriteServ(user->fd,"404 %s %s :Cannot send to channel (no external messages)", user->nick, chan->name);
- return;
- }
- if ((chan->binarymodes & CM_MODERATED) && (cstatus(user,chan)<STATUS_VOICE))
- {
- WriteServ(user->fd,"404 %s %s :Cannot send to channel (+m)", user->nick, chan->name);
- return;
- }
-
- int MOD_RESULT = 0;
-
- std::string temp = parameters[1];
- FOREACH_RESULT(OnUserPreMessage(user,chan,TYPE_CHANNEL,temp));
- if (MOD_RESULT) {
- return;
- }
- parameters[1] = (char*)temp.c_str();
-
- if (temp == "")
- {
- WriteServ(user->fd,"412 %s No text to send", user->nick);
- return;
- }
-
- ChanExceptSender(chan, user, "PRIVMSG %s :%s", chan->name, parameters[1]);
- FOREACH_MOD OnUserMessage(user,chan,TYPE_CHANNEL,parameters[1]);
- }
- else
- {
- /* no such nick/channel */
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
- return;
- }
-
- dest = Find(parameters[0]);
- if (dest)
- {
- if (strcmp(dest->awaymsg,""))
- {
- /* auto respond with aweh msg */
- WriteServ(user->fd,"301 %s %s :%s",user->nick,dest->nick,dest->awaymsg);
- }
-
- int MOD_RESULT = 0;
-
- std::string temp = parameters[1];
- FOREACH_RESULT(OnUserPreMessage(user,dest,TYPE_USER,temp));
- if (MOD_RESULT) {
- return;
- }
- parameters[1] = (char*)temp.c_str();
-
- if (dest->fd > -1)
- {
- // direct write, same server
- WriteTo(user, dest, "PRIVMSG %s :%s", dest->nick, parameters[1]);
- }
-
- FOREACH_MOD OnUserMessage(user,dest,TYPE_USER,parameters[1]);
- }
- else
- {
- /* no such nick/channel */
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
-}
-
-void handle_notice(char **parameters, int pcnt, userrec *user)
-{
- userrec *dest;
- chanrec *chan;
-
- user->idle_lastmsg = TIME;
-
- if (loop_call(handle_notice,parameters,pcnt,user,0,pcnt-2,0))
- return;
- if (parameters[0][0] == '$')
- {
- // notice to server mask
- char* servermask = parameters[0];
- servermask++;
- if (match(Config->ServerName,servermask))
- {
- NoticeAll(user, true, "%s",parameters[1]);
- }
- return;
- }
- else if (parameters[0][0] == '#')
- {
- chan = FindChan(parameters[0]);
- if (chan)
- {
- if ((chan->binarymodes & CM_NOEXTERNAL) && (!has_channel(user,chan)))
- {
- WriteServ(user->fd,"404 %s %s :Cannot send to channel (no external messages)", user->nick, chan->name);
- return;
- }
- if ((chan->binarymodes & CM_MODERATED) && (cstatus(user,chan)<STATUS_VOICE))
- {
- WriteServ(user->fd,"404 %s %s :Cannot send to channel (+m)", user->nick, chan->name);
- return;
- }
-
- int MOD_RESULT = 0;
-
- std::string temp = parameters[1];
- FOREACH_RESULT(OnUserPreNotice(user,chan,TYPE_CHANNEL,temp));
- if (MOD_RESULT) {
- return;
- }
- parameters[1] = (char*)temp.c_str();
-
- if (temp == "")
- {
- WriteServ(user->fd,"412 %s No text to send", user->nick);
- return;
- }
-
- ChanExceptSender(chan, user, "NOTICE %s :%s", chan->name, parameters[1]);
-
- FOREACH_MOD OnUserNotice(user,chan,TYPE_CHANNEL,parameters[1]);
- }
- else
- {
- /* no such nick/channel */
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
- return;
- }
-
- dest = Find(parameters[0]);
- if (dest)
- {
- int MOD_RESULT = 0;
-
- std::string temp = parameters[1];
- FOREACH_RESULT(OnUserPreNotice(user,dest,TYPE_USER,temp));
- if (MOD_RESULT) {
- return;
- }
- parameters[1] = (char*)temp.c_str();
-
- if (dest->fd > -1)
- {
- // direct write, same server
- WriteTo(user, dest, "NOTICE %s :%s", dest->nick, parameters[1]);
- }
-
- FOREACH_MOD OnUserNotice(user,dest,TYPE_USER,parameters[1]);
- }
- else
- {
- /* no such nick/channel */
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- }
-}
-
-void handle_server(char **parameters, int pcnt, userrec *user)
-{
- WriteServ(user->fd,"666 %s :You cannot identify as a server, you are a USER. IRC Operators informed.",user->nick);
- WriteOpers("*** WARNING: %s attempted to issue a SERVER command and is registered as a user!",user->nick);
-}
-
-void handle_info(char **parameters, int pcnt, userrec *user)
-{
- WriteServ(user->fd,"371 %s :. o O (The Inspire Internet Relay Chat Server) O o .",user->nick);
- WriteServ(user->fd,"371 %s : ",user->nick);
- WriteServ(user->fd,"371 %s :Core developers: Craig Edwards (Brain)",user->nick);
- WriteServ(user->fd,"371 %s : Craig McLure",user->nick);
- WriteServ(user->fd,"371 %s : ",user->nick);
- WriteServ(user->fd,"371 %s :Contributors: typobox43",user->nick);
- WriteServ(user->fd,"371 %s : w00t",user->nick);
- WriteServ(user->fd,"371 %s : Om",user->nick);
- WriteServ(user->fd,"371 %s : Jazza",user->nick);
- WriteServ(user->fd,"371 %s : ",user->nick);
- WriteServ(user->fd,"371 %s :Testers: CC",user->nick);
- WriteServ(user->fd,"371 %s : Om",user->nick);
- WriteServ(user->fd,"371 %s : Piggles",user->nick);
- WriteServ(user->fd,"371 %s : Foamy",user->nick);
- WriteServ(user->fd,"371 %s : Hart",user->nick);
- WriteServ(user->fd,"371 %s : RageD",user->nick);
- WriteServ(user->fd,"371 %s : [ed]",user->nick);
- WriteServ(user->fd,"371 %s : Azhrarn",user->nick);
- WriteServ(user->fd,"371 %s : nenolod",user->nick);
- WriteServ(user->fd,"371 %s : luigiman",user->nick);
- WriteServ(user->fd,"371 %s : Chu",user->nick);
- WriteServ(user->fd,"371 %s : aquanight",user->nick);
- WriteServ(user->fd,"371 %s : xptek",user->nick);
- WriteServ(user->fd,"371 %s : Grantlinks",user->nick);
- WriteServ(user->fd,"371 %s : Rob",user->nick);
- WriteServ(user->fd,"371 %s : angelic",user->nick);
- WriteServ(user->fd,"371 %s : Jason",user->nick);
- WriteServ(user->fd,"371 %s : ThaPrince",user->nick);
- WriteServ(user->fd,"371 %s : ",user->nick);
- WriteServ(user->fd,"371 %s :Thanks to irc-junkie and searchirc",user->nick);
- WriteServ(user->fd,"371 %s :for the nice comments and the help",user->nick);
- WriteServ(user->fd,"371 %s :you gave us in attracting users to",user->nick);
- WriteServ(user->fd,"371 %s :this software.",user->nick);
- WriteServ(user->fd,"371 %s : ",user->nick);
- WriteServ(user->fd,"371 %s :Best experienced with: An IRC client.",user->nick);
- FOREACH_MOD OnInfo(user);
- WriteServ(user->fd,"374 %s :End of /INFO list",user->nick);
-}
-
-void handle_time(char **parameters, int pcnt, userrec *user)
-{
- time_t rawtime;
- struct tm * timeinfo;
-
- time(&rawtime);
- timeinfo = localtime(&rawtime);
- WriteServ(user->fd,"391 %s %s :%s",user->nick,Config->ServerName,asctime(timeinfo));
-
-}
-
-void handle_whois(char **parameters, int pcnt, userrec *user)
-{
- userrec *dest;
- if (loop_call(handle_whois,parameters,pcnt,user,0,pcnt-1,0))
- return;
- dest = Find(parameters[0]);
- if (dest)
- {
- do_whois(user,dest,0,0,parameters[0]);
- }
- else
- {
- /* no such nick/channel */
- WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, parameters[0]);
- WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]);
- }
-}