diff options
-rw-r--r-- | include/inspircd.h | 5 | ||||
-rw-r--r-- | include/message.h | 33 | ||||
-rw-r--r-- | src/InspIRCd.dev | 16 | ||||
-rw-r--r-- | src/InspIRCd.layout | 51 | ||||
-rw-r--r-- | src/inspircd.cpp | 362 | ||||
-rw-r--r-- | src/message.cpp | 406 |
6 files changed, 482 insertions, 391 deletions
diff --git a/include/inspircd.h b/include/inspircd.h index b8403b76b..a5544d904 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -88,14 +88,11 @@ void WriteFrom(int sock, userrec *user,char* text, ...); void WriteTo(userrec *source, userrec *dest,char *data, ...); void WriteChannel(chanrec* Ptr, userrec* user, char* text, ...); void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...); -int common_channels(userrec *u, userrec *u2); void WriteCommon(userrec *u, char* text, ...); void WriteCommonExcept(userrec *u, char* text, ...); void WriteWallOps(userrec *source, bool local_only, char* text, ...); -int isnick(const char *n); userrec* Find(std::string nick); chanrec* FindChan(const char* chan); -char* cmode(userrec *user, chanrec *chan); std::string getservername(); std::string getserverdesc(); std::string getnetworkname(); @@ -114,8 +111,6 @@ void kill_link(userrec *user,const char* r); int usercount(chanrec *c); void call_handler(const char* commandname,char **parameters, int pcnt, userrec *user); void send_network_quit(const char* nick, const char* reason); -void ChangeName(userrec* user, const char* gecos); -void ChangeDisplayedHost(userrec* user, const char* host); long GetRevision(); // mesh network functions diff --git a/include/message.h b/include/message.h new file mode 100644 index 000000000..4958af0f1 --- /dev/null +++ b/include/message.h @@ -0,0 +1,33 @@ +#ifndef __MESSAGE_H +#define __MESSAGE_H + +// include the common header files + +#include <typeinfo> +#include <iostream> +#include <string> +#include <deque> +#include <sstream> +#include <vector> +#include "users.h" +#include "channels.h" + +int common_channels(userrec *u, userrec *u2); +void chop(char* str); +void tidystring(char* str); +void safedelete(chanrec *p); +void safedelete(userrec *p); +void Blocking(int s); +void NonBlocking(int s); +int CleanAndResolve (char *resolvedHost, const char *unresolvedHost); +int c_count(userrec* u); +bool hasumode(userrec* user, char mode); +void ChangeName(userrec* user, const char* gecos); +void ChangeDisplayedHost(userrec* user, const char* host); +int isident(const char* n); +int isnick(const char* n); +char* cmode(userrec *user, chanrec *chan); +int cstatus(userrec *user, chanrec *chan); +int has_channel(userrec *u, chanrec *c); + +#endif diff --git a/src/InspIRCd.dev b/src/InspIRCd.dev index 39cb30741..05c3b891a 100644 --- a/src/InspIRCd.dev +++ b/src/InspIRCd.dev @@ -1,7 +1,7 @@ [Project] FileName=InspIRCd.dev Name=InspIRCd - The Inspire Internet Relay Chat Daemon -UnitCount=39 +UnitCount=41 Type=1 Ver=1 ObjFiles= @@ -416,9 +416,9 @@ OverrideBuildCmd=0 BuildCmd= [Unit40] -FileName=modules\m_helpop.cpp +FileName=message.cpp CompileCpp=1 -Folder=Modules +Folder=Source Compile=1 Link=1 Priority=1000 @@ -445,3 +445,13 @@ Priority=1000 OverrideBuildCmd=0 BuildCmd= +[Unit41] +FileName=..\include\message.h +CompileCpp=1 +Folder=Headers +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/src/InspIRCd.layout b/src/InspIRCd.layout index 5d64f9825..ff4ff18e8 100644 --- a/src/InspIRCd.layout +++ b/src/InspIRCd.layout @@ -1,6 +1,6 @@ [Editors] -Focused=24 -Order=1,2,4,6,3,7,25,5,24,-1 +Focused=39 +Order=1,2,4,6,3,7,25,5,24,-1,39 [Editor_0] Open=0 @@ -14,8 +14,8 @@ LeftChar=1 Open=1 Top=0 CursorCol=1 -CursorRow=7039 -TopLine=7013 +CursorRow=1614 +TopLine=1600 LeftChar=1 [Editor_2] @@ -75,7 +75,7 @@ TopLine=1 LeftChar=1 [Editor_9] -Open=0 +Open=1 Top=0 CursorCol=1 CursorRow=113 @@ -131,19 +131,19 @@ TopLine=41 LeftChar=1 [Editor_16] -Open=0 +Open=1 Top=0 -CursorCol=6 -CursorRow=32 +CursorCol=1 +CursorRow=29 TopLine=1 LeftChar=1 [Editor_17] Open=1 Top=0 -CursorCol=25 -CursorRow=130 -TopLine=76 +CursorCol=1 +CursorRow=89 +TopLine=72 LeftChar=1 [Editor_18] @@ -163,11 +163,11 @@ TopLine=1 LeftChar=1 [Editor_20] -Open=0 +Open=1 Top=0 CursorCol=32 CursorRow=30 -TopLine=1 +TopLine=573 LeftChar=1 [Editor_21] @@ -196,10 +196,10 @@ LeftChar=1 [Editor_24] Open=1 -Top=1 -CursorCol=15 -CursorRow=175 -TopLine=155 +Top=0 +CursorCol=2 +CursorRow=206 +TopLine=161 LeftChar=1 [Editor_25] Open=1 @@ -216,7 +216,7 @@ CursorRow=13 TopLine=23 LeftChar=1 [Editor_27] -Open=0 +Open=1 Top=0 CursorCol=3 CursorRow=67 @@ -300,9 +300,16 @@ CursorRow=70 TopLine=40 LeftChar=1 [Editor_39] -Open=0 +Open=1 +Top=1 +CursorCol=1 +CursorRow=405 +TopLine=352 +LeftChar=1 +[Editor_40] +Open=1 Top=0 -CursorCol=20 -CursorRow=84 -TopLine=13 +CursorCol=41 +CursorRow=31 +TopLine=1 LeftChar=1 diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 29b3e48be..99c9196c0 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -51,6 +51,7 @@ using namespace std; #include "modules.h" #include "dynamic.h" #include "wildcard.h" +#include "message.h" #ifdef GCC3 #define nspace __gnu_cxx @@ -187,108 +188,6 @@ void AddWhoWas(userrec* u); std::vector<long> auth_cookies; std::stringstream config_f(stringstream::in | stringstream::out); -void safedelete(userrec *p) -{ - if (p) - { - log(DEBUG,"deleting %s %s %s %s",p->nick,p->ident,p->dhost,p->fullname); - log(DEBUG,"safedelete(userrec*): pointer is safe to delete"); - delete p; - p = NULL; - } - else - { - log(DEBUG,"safedelete(userrec*): unsafe pointer operation squished"); - } -} - -void safedelete(chanrec *p) -{ - if (p) - { - delete p; - p = NULL; - log(DEBUG,"safedelete(chanrec*): pointer is safe to delete"); - } - else - { - log(DEBUG,"safedelete(chanrec*): unsafe pointer operation squished"); - } -} - - -void tidystring(char* str) -{ - // strips out double spaces before a : parameter - - char temp[MAXBUF]; - bool go_again = true; - - if (!str) - { - return; - } - - while ((str[0] == ' ') && (strlen(str)>0)) - { - str++; - } - - while (go_again) - { - bool noparse = false; - int t = 0, a = 0; - go_again = false; - while (a < strlen(str)) - { - if ((a<strlen(str)-1) && (noparse==false)) - { - if ((str[a] == ' ') && (str[a+1] == ' ')) - { - log(DEBUG,"Tidied extra space out of string: %s",str); - go_again = true; - a++; - } - } - - if (a<strlen(str)-1) - { - if ((str[a] == ' ') && (str[a+1] == ':')) - { - noparse = true; - } - } - - temp[t++] = str[a++]; - } - temp[t] = '\0'; - strncpy(str,temp,MAXBUF); - } -} - -/* chop a string down to 512 characters and preserve linefeed (irc max - * line length) */ - -void chop(char* str) -{ - if (!str) - { - log(DEBUG,"ERROR! Null string passed to chop()!"); - return; - } - string temp = str; - FOREACH_MOD OnServerRaw(temp,false); - const char* str2 = temp.c_str(); - sprintf(str,"%s",str2); - - - if (strlen(str) >= 512) - { - str[509] = '\r'; - str[510] = '\n'; - str[511] = '\0'; - } -} long GetRevision() @@ -472,42 +371,6 @@ void ReadConfig(void) } } -void Blocking(int s) -{ - int flags; - log(DEBUG,"Blocking: %d",s); - flags = fcntl(s, F_GETFL, 0); - fcntl(s, F_SETFL, flags ^ O_NONBLOCK); -} - -void NonBlocking(int s) -{ - int flags; - log(DEBUG,"NonBlocking: %d",s); - flags = fcntl(s, F_GETFL, 0); - //fcntl(s, F_SETFL, O_NONBLOCK); - fcntl(s, F_SETFL, flags | O_NONBLOCK); -} - - -int CleanAndResolve (char *resolvedHost, const char *unresolvedHost) -{ - struct hostent *hostPtr = NULL; - struct in_addr addr; - - memset (resolvedHost, '\0',MAXBUF); - if(unresolvedHost == NULL) - return(ERROR); - if ((inet_aton(unresolvedHost,&addr)) == 0) - return(ERROR); - hostPtr = gethostbyaddr ((char *)&addr.s_addr,sizeof(addr.s_addr),AF_INET); - if (hostPtr != NULL) - snprintf(resolvedHost,MAXBUF,"%s",hostPtr->h_name); - else - snprintf(resolvedHost,MAXBUF,"%s",unresolvedHost); - return (TRUE); -} - /* write formatted text to a socket, in same format as printf */ void Write(int sock,char *text, ...) @@ -721,16 +584,6 @@ void ChanExceptSender(chanrec* Ptr, userrec* user, char* text, ...) } } -int c_count(userrec* u) -{ - int z = 0; - for (int i =0; i != MAXCHANS; i++) - if (u->chans[i].channel != NULL) - z++; - return z; - -} - std::string GetServerDescription(char* servername) { @@ -751,38 +604,6 @@ std::string GetServerDescription(char* servername) } -/* return 0 or 1 depending if users u and u2 share one or more common channels - * (used by QUIT, NICK etc which arent channel specific notices) */ - -int common_channels(userrec *u, userrec *u2) -{ - int i = 0; - int z = 0; - - if ((!u) || (!u2)) - { - log(DEFAULT,"*** BUG *** common_channels was given an invalid parameter"); - return 0; - } - for (int i = 0; i != MAXCHANS; i++) - { - for (z = 0; z != MAXCHANS; z++) - { - if ((u->chans[i].channel != NULL) && (u2->chans[z].channel != NULL)) - { - if ((u->chans[i].channel == u2->chans[z].channel) && (u->chans[i].channel) && (u2->chans[z].channel) && (u->registered == 7) && (u2->registered == 7)) - { - if ((c_count(u)) && (c_count(u2))) - { - return 1; - } - } - } - } - } - return 0; -} - /* write a formatted string to all users who share at least one common * channel, including the source user e.g. for use in NICK */ @@ -1036,15 +857,6 @@ void NetSendToAllExcept(const char* target,char* s) } -bool hasumode(userrec* user, char mode) -{ - if (user) - { - return (strchr(user->modes,mode)>0); - } - else return false; -} - void WriteMode(const char* modes, int flags, const char* text, ...) { if ((!text) || (!modes) || (!flags)) @@ -1098,29 +910,6 @@ void WriteMode(const char* modes, int flags, const char* text, ...) } } -void ChangeName(userrec* user, const char* gecos) -{ - strncpy(user->fullname,gecos,MAXBUF); - - // TODO: replace these with functions: - // NetSendToAll - to all - // NetSendToCommon - to all that hold users sharing a common channel with another user - // NetSendToOne - to one server - // NetSendToAllExcept - send to all but one - // all by servername - - char buffer[MAXBUF]; - snprintf(buffer,MAXBUF,"a %s :%s",user->nick,gecos); - NetSendToAll(buffer); -} - -void ChangeDisplayedHost(userrec* user, const char* host) -{ - strncpy(user->dhost,host,160); - char buffer[MAXBUF]; - snprintf(buffer,MAXBUF,"b %s %s",user->nick,host); - NetSendToAll(buffer); -} void WriteWallOps(userrec *source, bool local_only, char* text, ...) { @@ -1184,71 +973,7 @@ void strlower(char *n) } } -/* verify that a user's ident and nickname is valid */ - -int isident(const char* n) -{ - char v[MAXBUF]; - if (!n) - { - return 0; - } - if (!strcmp(n,"")) - { - return 0; - } - for (int i = 0; i != strlen(n); i++) - { - if ((n[i] < 33) || (n[i] > 125)) - { - return 0; - } - /* can't occur ANYWHERE in an Ident! */ - if (strchr("<>,./?:;@'~#=+()*&%$£ \"!",n[i])) - { - return 0; - } - } - return 1; -} - - -int isnick(const char* n) -{ - int i = 0; - char v[MAXBUF]; - if (!n) - { - return 0; - } - if (!strcmp(n,"")) - { - return 0; - } - if (strlen(n) > NICKMAX-1) - { - return 0; - } - for (int i = 0; i != strlen(n); i++) - { - if ((n[i] < 33) || (n[i] > 125)) - { - return 0; - } - /* can't occur ANYWHERE in a nickname! */ - if (strchr("<>,./?:;@'~#=+()*&%$£ \"!",n[i])) - { - return 0; - } - /* can't occur as the first char of a nickname... */ - if ((strchr("0123456789",n[i])) && (!i)) - { - return 0; - } - } - return 1; -} /* Find a user record by nickname and return a pointer to it */ @@ -1332,39 +1057,6 @@ void purge_empty_chans(void) log(DEBUG,"completed channel purge, killed %d",purge); } -/* returns the status character for a given user on a channel, e.g. @ for op, - * % for halfop etc. If the user has several modes set, the highest mode - * the user has must be returned. */ - -char* cmode(userrec *user, chanrec *chan) -{ - if ((!user) || (!chan)) - { - log(DEFAULT,"*** BUG *** cmode was given an invalid parameter"); - return ""; - } - - int i; - for (int i = 0; i != MAXCHANS; i++) - { - if ((user->chans[i].channel == chan) && (chan != NULL)) - { - if ((user->chans[i].uc_modes & UCMODE_OP) > 0) - { - return "@"; - } - if ((user->chans[i].uc_modes & UCMODE_HOP) > 0) - { - return "%"; - } - if ((user->chans[i].uc_modes & UCMODE_VOICE) > 0) - { - return "+"; - } - return ""; - } - } -} char scratch[MAXBUF]; char sparam[MAXBUF]; @@ -1440,39 +1132,6 @@ char* chanmodes(chanrec *chan) return scratch; } -/* returns the status value for a given user on a channel, e.g. STATUS_OP for - * op, STATUS_VOICE for voice etc. If the user has several modes set, the - * highest mode the user has must be returned. */ - -int cstatus(userrec *user, chanrec *chan) -{ - if ((!chan) || (!user)) - { - log(DEFAULT,"*** BUG *** cstatus was given an invalid parameter"); - return 0; - } - - for (int i = 0; i != MAXCHANS; i++) - { - if ((user->chans[i].channel == chan) && (chan != NULL)) - { - if ((user->chans[i].uc_modes & UCMODE_OP) > 0) - { - return STATUS_OP; - } - if ((user->chans[i].uc_modes & UCMODE_HOP) > 0) - { - return STATUS_HOP; - } - if ((user->chans[i].uc_modes & UCMODE_VOICE) > 0) - { - return STATUS_VOICE; - } - return STATUS_NORMAL; - } - } -} - /* compile a userlist of a channel into a string, each nick seperated by * spaces and op, voice etc status shown as @ and + */ @@ -1952,25 +1611,6 @@ void kick_channel(userrec *src,userrec *user, chanrec *Ptr, char* reason) } -/* returns 1 if user u has channel c in their record, 0 if not */ - -int has_channel(userrec *u, chanrec *c) -{ - if ((!u) || (!c)) - { - log(DEFAULT,"*** BUG *** has_channel was given an invalid parameter"); - return 0; - } - for (int i =0; i != MAXCHANS; i++) - { - if (u->chans[i].channel == c) - { - return 1; - } - } - return 0; -} - int give_ops(userrec *user,char *dest,chanrec *chan,int status) { userrec *d; diff --git a/src/message.cpp b/src/message.cpp new file mode 100644 index 000000000..63fdae135 --- /dev/null +++ b/src/message.cpp @@ -0,0 +1,406 @@ +#include "inspircd.h" +#include "inspircd_io.h" +#include "inspircd_util.h" +#include "inspircd_config.h" +#include <unistd.h> +#include <fcntl.h> +#include <sys/errno.h> +#include <sys/ioctl.h> +#include <sys/utsname.h> +#include <cstdio> +#include <time.h> +#include <string> +#ifdef GCC3 +#include <ext/hash_map> +#else +#include <hash_map> +#endif +#include <map> +#include <sstream> +#include <vector> +#include <errno.h> +#include <deque> +#include <errno.h> +#include <unistd.h> +#include <sched.h> +#include "connection.h" +#include "users.h" +#include "servers.h" +#include "ctables.h" +#include "globals.h" +#include "modules.h" +#include "dynamic.h" +#include "wildcard.h" +#include "message.h" + + +/* return 0 or 1 depending if users u and u2 share one or more common channels + * (used by QUIT, NICK etc which arent channel specific notices) */ + +int common_channels(userrec *u, userrec *u2) +{ + int i = 0; + int z = 0; + + if ((!u) || (!u2)) + { + log(DEFAULT,"*** BUG *** common_channels was given an invalid parameter"); + return 0; + } + for (int i = 0; i != MAXCHANS; i++) + { + for (z = 0; z != MAXCHANS; z++) + { + if ((u->chans[i].channel != NULL) && (u2->chans[z].channel != NULL)) + { + if ((u->chans[i].channel == u2->chans[z].channel) && (u->chans[i].channel) && (u2->chans[z].channel) && (u->registered == 7) && (u2->registered == 7)) + { + if ((c_count(u)) && (c_count(u2))) + { + return 1; + } + } + } + } + } + return 0; +} + + +void safedelete(userrec *p) +{ + if (p) + { + log(DEBUG,"deleting %s %s %s %s",p->nick,p->ident,p->dhost,p->fullname); + log(DEBUG,"safedelete(userrec*): pointer is safe to delete"); + delete p; + p = NULL; + } + else + { + log(DEBUG,"safedelete(userrec*): unsafe pointer operation squished"); + } +} + +void safedelete(chanrec *p) +{ + if (p) + { + delete p; + p = NULL; + log(DEBUG,"safedelete(chanrec*): pointer is safe to delete"); + } + else + { + log(DEBUG,"safedelete(chanrec*): unsafe pointer operation squished"); + } +} + + +void tidystring(char* str) +{ + // strips out double spaces before a : parameter + + char temp[MAXBUF]; + bool go_again = true; + + if (!str) + { + return; + } + + while ((str[0] == ' ') && (strlen(str)>0)) + { + str++; + } + + while (go_again) + { + bool noparse = false; + int t = 0, a = 0; + go_again = false; + while (a < strlen(str)) + { + if ((a<strlen(str)-1) && (noparse==false)) + { + if ((str[a] == ' ') && (str[a+1] == ' ')) + { + log(DEBUG,"Tidied extra space out of string: %s",str); + go_again = true; + a++; + } + } + + if (a<strlen(str)-1) + { + if ((str[a] == ' ') && (str[a+1] == ':')) + { + noparse = true; + } + } + + temp[t++] = str[a++]; + } + temp[t] = '\0'; + strncpy(str,temp,MAXBUF); + } +} + +/* chop a string down to 512 characters and preserve linefeed (irc max + * line length) */ + +void chop(char* str) +{ + if (!str) + { + log(DEBUG,"ERROR! Null string passed to chop()!"); + return; + } + string temp = str; + FOREACH_MOD OnServerRaw(temp,false); + const char* str2 = temp.c_str(); + sprintf(str,"%s",str2); + + + if (strlen(str) >= 512) + { + str[509] = '\r'; + str[510] = '\n'; + str[511] = '\0'; + } +} + + +void Blocking(int s) +{ + int flags; + log(DEBUG,"Blocking: %d",s); + flags = fcntl(s, F_GETFL, 0); + fcntl(s, F_SETFL, flags ^ O_NONBLOCK); +} + +void NonBlocking(int s) +{ + int flags; + log(DEBUG,"NonBlocking: %d",s); + flags = fcntl(s, F_GETFL, 0); + //fcntl(s, F_SETFL, O_NONBLOCK); + fcntl(s, F_SETFL, flags | O_NONBLOCK); +} + +int CleanAndResolve (char *resolvedHost, const char *unresolvedHost) +{ + struct hostent *hostPtr = NULL; + struct in_addr addr; + + memset (resolvedHost, '\0',MAXBUF); + if(unresolvedHost == NULL) + return(ERROR); + if ((inet_aton(unresolvedHost,&addr)) == 0) + return(ERROR); + hostPtr = gethostbyaddr ((char *)&addr.s_addr,sizeof(addr.s_addr),AF_INET); + if (hostPtr != NULL) + snprintf(resolvedHost,MAXBUF,"%s",hostPtr->h_name); + else + snprintf(resolvedHost,MAXBUF,"%s",unresolvedHost); + return (TRUE); +} + +int c_count(userrec* u) +{ + int z = 0; + for (int i =0; i != MAXCHANS; i++) + if (u->chans[i].channel != NULL) + z++; + return z; + +} + +bool hasumode(userrec* user, char mode) +{ + if (user) + { + return (strchr(user->modes,mode)>0); + } + else return false; +} + + +void ChangeName(userrec* user, const char* gecos) +{ + strncpy(user->fullname,gecos,MAXBUF); + + // TODO: replace these with functions: + // NetSendToAll - to all + // NetSendToCommon - to all that hold users sharing a common channel with another user + // NetSendToOne - to one server + // NetSendToAllExcept - send to all but one + // all by servername + + char buffer[MAXBUF]; + snprintf(buffer,MAXBUF,"a %s :%s",user->nick,gecos); + NetSendToAll(buffer); +} + +void ChangeDisplayedHost(userrec* user, const char* host) +{ + strncpy(user->dhost,host,160); + char buffer[MAXBUF]; + snprintf(buffer,MAXBUF,"b %s %s",user->nick,host); + NetSendToAll(buffer); +} + +/* verify that a user's ident and nickname is valid */ + +int isident(const char* n) +{ + char v[MAXBUF]; + if (!n) + + { + return 0; + } + if (!strcmp(n,"")) + { + return 0; + } + for (int i = 0; i != strlen(n); i++) + { + if ((n[i] < 33) || (n[i] > 125)) + { + return 0; + } + /* can't occur ANYWHERE in an Ident! */ + if (strchr("<>,./?:;@'~#=+()*&%$£ \"!",n[i])) + { + return 0; + } + } + return 1; +} + + +int isnick(const char* n) +{ + int i = 0; + char v[MAXBUF]; + if (!n) + { + return 0; + } + if (!strcmp(n,"")) + { + return 0; + } + if (strlen(n) > NICKMAX-1) + { + return 0; + } + for (int i = 0; i != strlen(n); i++) + { + if ((n[i] < 33) || (n[i] > 125)) + { + return 0; + } + /* can't occur ANYWHERE in a nickname! */ + if (strchr("<>,./?:;@'~#=+()*&%$£ \"!",n[i])) + { + return 0; + } + /* can't occur as the first char of a nickname... */ + if ((strchr("0123456789",n[i])) && (!i)) + { + return 0; + } + } + return 1; +} + +/* returns the status character for a given user on a channel, e.g. @ for op, + * % for halfop etc. If the user has several modes set, the highest mode + * the user has must be returned. */ + +char* cmode(userrec *user, chanrec *chan) +{ + if ((!user) || (!chan)) + { + log(DEFAULT,"*** BUG *** cmode was given an invalid parameter"); + return ""; + } + + int i; + for (int i = 0; i != MAXCHANS; i++) + { + if ((user->chans[i].channel == chan) && (chan != NULL)) + { + if ((user->chans[i].uc_modes & UCMODE_OP) > 0) + { + return "@"; + } + if ((user->chans[i].uc_modes & UCMODE_HOP) > 0) + { + return "%"; + } + if ((user->chans[i].uc_modes & UCMODE_VOICE) > 0) + { + return "+"; + } + return ""; + } + } +} + +/* returns the status value for a given user on a channel, e.g. STATUS_OP for + * op, STATUS_VOICE for voice etc. If the user has several modes set, the + * highest mode the user has must be returned. */ + +int cstatus(userrec *user, chanrec *chan) +{ + if ((!chan) || (!user)) + { + log(DEFAULT,"*** BUG *** cstatus was given an invalid parameter"); + return 0; + } + + for (int i = 0; i != MAXCHANS; i++) + { + if ((user->chans[i].channel == chan) && (chan != NULL)) + { + if ((user->chans[i].uc_modes & UCMODE_OP) > 0) + { + return STATUS_OP; + } + if ((user->chans[i].uc_modes & UCMODE_HOP) > 0) + { + return STATUS_HOP; + } + if ((user->chans[i].uc_modes & UCMODE_VOICE) > 0) + { + return STATUS_VOICE; + } + return STATUS_NORMAL; + } + } +} + +/* returns 1 if user u has channel c in their record, 0 if not */ + +int has_channel(userrec *u, chanrec *c) +{ + if ((!u) || (!c)) + { + log(DEFAULT,"*** BUG *** has_channel was given an invalid parameter"); + return 0; + } + for (int i =0; i != MAXCHANS; i++) + { + if (u->chans[i].channel == c) + { + return 1; + } + } + return 0; +} + + + |