From ff37678cc076af9590f0e9ef427445f3b3bfa65f Mon Sep 17 00:00:00 2001 From: Marius Halden Date: Fri, 6 Nov 2015 20:04:39 +0100 Subject: Add support for owner and admin modes --- irc.h | 10 ++++++---- irc_send.c | 28 ++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/irc.h b/irc.h index 8b2e4947..02b307df 100644 --- a/irc.h +++ b/irc.h @@ -186,10 +186,12 @@ struct irc_channel_funcs { }; typedef enum { - IRC_CHANNEL_USER_OP = 1, - IRC_CHANNEL_USER_HALFOP = 2, - IRC_CHANNEL_USER_VOICE = 4, - IRC_CHANNEL_USER_NONE = 8, + IRC_CHANNEL_USER_OWNER = 1, + IRC_CHANNEL_USER_ADMIN = 2, + IRC_CHANNEL_USER_OP = 4, + IRC_CHANNEL_USER_HALFOP = 8, + IRC_CHANNEL_USER_VOICE = 16, + IRC_CHANNEL_USER_NONE = 32, } irc_channel_user_flags_t; typedef struct irc_channel_user { diff --git a/irc_send.c b/irc_send.c index 3da725a4..529118ad 100644 --- a/irc_send.c +++ b/irc_send.c @@ -44,7 +44,7 @@ void irc_send_login(irc_t *irc) PACKAGE, BITLBEE_VERSION, ARCH, CPU); irc_send_num(irc, 3, ":%s", IRCD_INFO); irc_send_num(irc, 4, "%s %s %s %s", irc->root->host, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES); - irc_send_num(irc, 5, "PREFIX=(ohv)@%%+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d CHANNELLEN=%d " + irc_send_num(irc, 5, "PREFIX=(ohv)~&@%%+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d CHANNELLEN=%d " "NETWORK=BitlBee SAFELIST CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 " "FLOOD=0/9999 :are supported by this server", CTYPES, CMODES, MAX_NICK_LENGTH - 1, MAX_NICK_LENGTH - 1); @@ -213,7 +213,11 @@ void irc_send_names(irc_channel_t *ic) *namelist = 0; } - if (icu->flags & IRC_CHANNEL_USER_OP) { + if (icu->flags & IRC_CHANNEL_USER_OWNER) { + strcat(namelist, "~"); + } else if (icu->flags & IRC_CHANNEL_USER_ADMIN) { + strcat(namelist, "&"); + } else if (icu->flags & IRC_CHANNEL_USER_OP) { strcat(namelist, "@"); } else if (icu->flags & IRC_CHANNEL_USER_HALFOP) { strcat(namelist, "%"); @@ -373,11 +377,27 @@ void irc_send_nick(irc_user_t *iu, const char *new) void irc_send_channel_user_mode_diff(irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t old, irc_channel_user_flags_t new) { - char changes[3 * (5 + strlen(iu->nick))]; - char from[strlen(ic->irc->root->nick) + strlen(ic->irc->root->user) + strlen(ic->irc->root->host) + 3]; + char changes[5 * (5 + strlen(iu->nick))]; + char from[strlen(ic->irc->root->nick) + strlen(ic->irc->root->user) + strlen(ic->irc->root->host) + 5]; int n; *changes = '\0'; n = 0; + if ((old & IRC_CHANNEL_USER_OWNER) != (new & IRC_CHANNEL_USER_OWNER)) { + n++; + if (new & IRC_CHANNEL_USER_OWNER) { + strcat(changes, "+q"); + } else { + strcat(changes, "-q"); + } + } + if ((old & IRC_CHANNEL_USER_ADMIN) != (new & IRC_CHANNEL_USER_ADMIN)) { + n++; + if (new & IRC_CHANNEL_USER_ADMIN) { + strcat(changes, "+a"); + } else { + strcat(changes, "-a"); + } + } if ((old & IRC_CHANNEL_USER_OP) != (new & IRC_CHANNEL_USER_OP)) { n++; if (new & IRC_CHANNEL_USER_OP) { -- cgit v1.2.3