From 285b02c36a5ce24811fc1bd75909bcc6029a172d Mon Sep 17 00:00:00 2001 From: Kevin Easton Date: Wed, 7 May 2008 08:48:49 +0000 Subject: [PATCH] Add $ishalfop( ) scripting function, as per EPIC. git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@34 13b04d17-f746-0410-82c6-800466cd88b0 --- include/module.h | 5 +++++ include/modval.h | 1 + include/names.h | 1 + source/functions.c | 18 ++++++++++++++++++ source/modules.c | 1 + source/names.c | 34 ++++++++++++++++++++++++++++------ 6 files changed, 54 insertions(+), 6 deletions(-) diff --git a/include/module.h b/include/module.h index 51d2950..85b5467 100644 --- a/include/module.h +++ b/include/module.h @@ -648,6 +648,11 @@ enum FUNCTION_VALUE CHECK_EXT_MAIL, DEFAULT_OUTPUT_FUNCTION, DEFAULT_STATUS_OUTPUT_FUNCTION, + +/* names.c */ + IS_HALFOP, + +/* leave at the end */ NUMBER_OF_GLOBAL_FUNCTIONS }; diff --git a/include/modval.h b/include/modval.h index b1adb2d..64d07ec 100644 --- a/include/modval.h +++ b/include/modval.h @@ -416,6 +416,7 @@ extern Function_ptr *global; #define is_channel (*(int (*)(char *))global[IS_CHANNEL]) #define make_channel (*(char *(*)(char *))global[MAKE_CHANNEL]) #define is_chanop (*(int (*)(char *, char *))global[IS_CHANOP]) +#define is_halfop (*(int (*)(char *, char *))global[IS_HALFOP]) #define im_on_channel (*(int (*)(char *, int ))global[IM_ON_CHANNEL]) #define is_on_channel (*(int (*)(char *, int , char *))global[IS_ON_CHANNEL]) #define add_channel (*(ChannelList *(*)(char *, int, int))global[ADD_CHANNEL]) diff --git a/include/names.h b/include/names.h index ad4fff7..003f5d4 100644 --- a/include/names.h +++ b/include/names.h @@ -35,6 +35,7 @@ int got_info (char *, int, int); int is_channel_mode (char *, int, int); int BX_is_chanop (char *, char *); +int BX_is_halfop (char *, char *); char *is_chanoper (char *, char *); ChannelList *BX_lookup_channel (char *, int, int); char *BX_get_channel_mode (char *, int); diff --git a/source/functions.c b/source/functions.c index 42fb4e9..b5ffe8e 100644 --- a/source/functions.c +++ b/source/functions.c @@ -169,6 +169,7 @@ static char *function_encode (char *, unsigned char *); static char *function_index (char *, char *); static char *function_ischannel (char *, char *); static char *function_ischanop (char *, char *); +static char *function_ishalfop (char *, char *); static char *function_left (char *, char *); static char *function_listen (char *, char *); static char *function_match (char *, char *); @@ -580,6 +581,7 @@ static BuiltInFunctions built_in_functions[] = { "ISCURCHAN", function_iscurchan }, { "ISDIGIT", function_isdigit }, { "ISDISPLAYING", function_isdisplaying }, + { "ISHALFOP", function_ishalfop }, { "ISIGNORED", function_isignored }, { "ISNUMBER", function_isnumber }, { "ISOP", function_isop }, @@ -1747,6 +1749,22 @@ BUILT_IN_FUNCTION(function_ischanop, input) RETURN_INT(is_chanop(input, nick)); } +/* + * Usage: $ishalfop(nick channel) + * Returns: 1 if is a channel half-op on + * 0 if is not a channel half-op on + * * O R * + * if you are not on + * + */ +BUILT_IN_FUNCTION(function_ishalfop, input) +{ + char *nick; + + GET_STR_ARG(nick, input); + RETURN_INT(is_halfop(input, nick)); +} + /* * Usage: $word(jUmber text) diff --git a/source/modules.c b/source/modules.c index e3e1167..a6633f5 100644 --- a/source/modules.c +++ b/source/modules.c @@ -494,6 +494,7 @@ static int already_done = 0; /* names.c */ global_table[IS_CHANOP] = (Function_ptr) BX_is_chanop; + global_table[IS_HALFOP] = (Function_ptr) BX_is_halfop; global_table[IS_CHANNEL] = (Function_ptr) BX_is_channel; global_table[MAKE_CHANNEL] = (Function_ptr) BX_make_channel; /* this is really in misc.c */ global_table[IM_ON_CHANNEL] = (Function_ptr) BX_im_on_channel; diff --git a/source/names.c b/source/names.c index 079b093..14545f7 100644 --- a/source/names.c +++ b/source/names.c @@ -407,12 +407,16 @@ ChannelList *BX_add_to_channel(char *channel, char *nick, int server, int oper, new->flags |= NICK_VOICE; if (away) { - if (*away == 'H') + if (strchr(away,'H')) new->flags &= ~NICK_AWAY; else new->flags |= NICK_AWAY; - if (*(away+1) == '*') + + if (strchr(away, '*')) new->flags |= NICK_IRCOP; + + if (strchr(away, '%')) + new->flags |= NICK_HALFOP; } } else if (check_whowas_chan_buffer(channel, -1, 0)) @@ -436,12 +440,16 @@ ChannelList *BX_add_to_channel(char *channel, char *nick, int server, int oper, new->flags |= NICK_VOICE; if (away) { - if (*away == 'H') - new->flags |= NICK_AWAY; - else + if (strchr(away,'H')) new->flags &= ~NICK_AWAY; - if (*(away+1) == '*') + else + new->flags |= NICK_AWAY; + + if (strchr(away, '*')) new->flags |= NICK_IRCOP; + + if (strchr(away, '%')) + new->flags |= NICK_HALFOP; } if (server1) malloc_strcpy(&new->server, server1); @@ -1422,6 +1430,20 @@ int BX_is_chanop(char *channel, char *nick) return 0; } +int BX_is_halfop(char *channel, char *nick) +{ + ChannelList *chan; + NickList *Nick; + + if (nick && (chan = lookup_channel(channel, from_server, CHAN_NOUNLINK))) + { + if ((Nick = find_nicklist_in_channellist(nick, chan, 0))) + if (nick_ishalfop(Nick)) + return 1; + } + return 0; +} + char *is_chanoper(char *channel, char *nick) { ChannelList *chan;