aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2015-11-08 16:11:08 +0100
committerMarius Halden <marius.h@lden.org>2016-05-07 14:24:24 +0200
commit338d8fed5e875048b6642f0ce54b6f25bd7ddcfb (patch)
tree2948aad367432146e0ab01607f6647468ff9abc5
parentbe652533d16a22dd1597e594b5845b8e2f1cde1e (diff)
Add support for owner/admin channel modes
-rw-r--r--irc.h10
-rw-r--r--irc_channel.c10
-rw-r--r--irc_send.c22
3 files changed, 34 insertions, 8 deletions
diff --git a/irc.h b/irc.h
index 2e0cc3d5..c579e618 100644
--- a/irc.h
+++ b/irc.h
@@ -198,10 +198,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_channel.c b/irc_channel.c
index 3ccbce55..e8564da7 100644
--- a/irc_channel.c
+++ b/irc_channel.c
@@ -441,7 +441,11 @@ void irc_channel_set_mode(irc_channel_t *ic, const char *s)
char irc_channel_user_get_prefix(irc_channel_user_t *icu)
{
- if (icu->flags & IRC_CHANNEL_USER_OP) {
+ if (icu->flags & IRC_CHANNEL_USER_OWNER) {
+ return '~';
+ } else if (icu->flags & IRC_CHANNEL_USER_ADMIN) {
+ return '&';
+ } else if (icu->flags & IRC_CHANNEL_USER_OP) {
return '@';
} else if (icu->flags & IRC_CHANNEL_USER_HALFOP) {
return '%';
@@ -920,6 +924,10 @@ static char *set_eval_show_users(set_t *set, char *value)
modechar = IRC_CHANNEL_USER_HALFOP;
} else if (last == '@') {
modechar = IRC_CHANNEL_USER_OP;
+ } else if (last == '&') {
+ modechar = IRC_CHANNEL_USER_ADMIN;
+ } else if (last == '~') {
+ modechar = IRC_CHANNEL_USER_OWNER;
}
if (strncmp(*part, "offline", 7) == 0) {
diff --git a/irc_send.c b/irc_send.c
index adf8211e..5b760fb3 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=(qaohv)~&@%%+ 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);
@@ -429,11 +429,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) {