diff options
-rw-r--r-- | include/cmd_whois.h | 2 | ||||
-rw-r--r-- | include/commands.h | 1 | ||||
-rw-r--r-- | src/cmd_whois.cpp | 62 | ||||
-rw-r--r-- | src/commands.cpp | 63 | ||||
-rw-r--r-- | src/modules/m_spanningtree.cpp | 1 |
5 files changed, 64 insertions, 65 deletions
diff --git a/include/cmd_whois.h b/include/cmd_whois.h index dc62d9fac..5e62e64a3 100644 --- a/include/cmd_whois.h +++ b/include/cmd_whois.h @@ -28,6 +28,8 @@ #include "users.h" #include "channels.h" +void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick); + class cmd_whois : public command_t { public: diff --git a/include/commands.h b/include/commands.h index ff6365d78..300c81aa7 100644 --- a/include/commands.h +++ b/include/commands.h @@ -30,7 +30,6 @@ bool is_uline(const char* server); long duration(const char* str); -void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick); bool host_matches_everyone(const std::string &mask, userrec* user); bool ip_matches_everyone(const std::string &ip, userrec* user); bool nick_matches_everyone(const std::string &nick, userrec* user); diff --git a/src/cmd_whois.cpp b/src/cmd_whois.cpp index f15bce87e..20215b9cf 100644 --- a/src/cmd_whois.cpp +++ b/src/cmd_whois.cpp @@ -61,6 +61,67 @@ extern std::vector<userrec*> all_opers; extern std::vector<userrec*> local_users; extern userrec* fd_ref_table[MAX_DESCRIPTORS]; +void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick) +{ + // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER + if (dest->registered == 7) + { + WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname); + if ((user == dest) || (*user->oper)) + { + WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, inet_ntoa(dest->ip4)); + } + std::string cl = chlist(dest,user); + if (cl.length()) + { + if (cl.length() > 400) + { + split_chlist(user,dest,cl); + } + else + { + WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl.c_str()); + } + } + if (*Config->HideWhoisServer && !(*user->oper)) + { + WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, Config->HideWhoisServer, Config->Network); + } + else + { + WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str()); + } + if (*dest->awaymsg) + { + WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg); + } + if (*dest->oper) + { + WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick, (strchr("aeiou",*dest->oper) ? "an" : "a"),dest->oper, Config->Network); + } + if ((!signon) && (!idle)) + { + FOREACH_MOD(I_OnWhois,OnWhois(user,dest)); + } + if (!strcasecmp(user->server,dest->server)) + { + // idle time and signon line can only be sent if youre on the same server (according to RFC) + WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon); + } + else + { + if ((idle) || (signon)) + WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, idle, signon); + } + WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick); + } + else + { + WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, nick); + WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, nick); + } +} + void cmd_whois::Handle (char **parameters, int pcnt, userrec *user) { userrec *dest; @@ -78,4 +139,3 @@ void cmd_whois::Handle (char **parameters, int pcnt, userrec *user) WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, parameters[0]); } } - diff --git a/src/commands.cpp b/src/commands.cpp index 904b4277e..46e3ae982 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -125,69 +125,6 @@ void split_chlist(userrec* user, userrec* dest, const std::string &cl) } } -/* XXX - perhaps this should be in cmd_whois? -- w00t */ -void do_whois(userrec* user, userrec* dest,unsigned long signon, unsigned long idle, char* nick) -{ - // bug found by phidjit - were able to whois an incomplete connection if it had sent a NICK or USER - if (dest->registered == 7) - { - WriteServ(user->fd,"311 %s %s %s %s * :%s",user->nick, dest->nick, dest->ident, dest->dhost, dest->fullname); - if ((user == dest) || (*user->oper)) - { - WriteServ(user->fd,"378 %s %s :is connecting from *@%s %s",user->nick, dest->nick, dest->host, inet_ntoa(dest->ip4)); - } - std::string cl = chlist(dest,user); - if (cl.length()) - { - if (cl.length() > 400) - { - split_chlist(user,dest,cl); - } - else - { - WriteServ(user->fd,"319 %s %s :%s",user->nick, dest->nick, cl.c_str()); - } - } - if (*Config->HideWhoisServer && !(*user->oper)) - { - WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, Config->HideWhoisServer, Config->Network); - } - else - { - WriteServ(user->fd,"312 %s %s %s :%s",user->nick, dest->nick, dest->server, GetServerDescription(dest->server).c_str()); - } - if (*dest->awaymsg) - { - WriteServ(user->fd,"301 %s %s :%s",user->nick, dest->nick, dest->awaymsg); - } - if (*dest->oper) - { - WriteServ(user->fd,"313 %s %s :is %s %s on %s",user->nick, dest->nick, (strchr("aeiou",*dest->oper) ? "an" : "a"),dest->oper, Config->Network); - } - if ((!signon) && (!idle)) - { - FOREACH_MOD(I_OnWhois,OnWhois(user,dest)); - } - if (!strcasecmp(user->server,dest->server)) - { - // idle time and signon line can only be sent if youre on the same server (according to RFC) - WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, abs((dest->idle_lastmsg)-TIME), dest->signon); - } - else - { - if ((idle) || (signon)) - WriteServ(user->fd,"317 %s %s %d %d :seconds idle, signon time",user->nick, dest->nick, idle, signon); - } - WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, dest->nick); - } - else - { - WriteServ(user->fd,"401 %s %s :No such nick/channel",user->nick, nick); - WriteServ(user->fd,"318 %s %s :End of /WHOIS list.",user->nick, nick); - } -} - - /* XXX - these really belong in helperfuncs perhaps -- w00t */ bool is_uline(const char* server) { diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index 31df4852d..296be5dd5 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -32,6 +32,7 @@ using namespace std; #include "channels.h" #include "modules.h" #include "commands.h" +#include "cmd_whois.h" #include "socket.h" #include "helperfuncs.h" #include "inspircd.h" |