X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fproto-bahamut.c;h=a0c1d98ef102d5f80004c0a05aa3cb8dc21a2f79;hb=fffe459760943b6ed8e0bb736c87ef424ce38fdc;hp=8f25c0bfbd607290f6f63ed25b2bbf71443d0970;hpb=fb43f026602d2cc87eef884f5616cd0925408c3e;p=srvx.git diff --git a/src/proto-bahamut.c b/src/proto-bahamut.c index 8f25c0b..a0c1d98 100644 --- a/src/proto-bahamut.c +++ b/src/proto-bahamut.c @@ -38,6 +38,9 @@ static dict_t service_msginfo_dict; /* holds service_message_info structs */ static int uplink_capab; static void privmsg_user_helper(struct userNode *un, void *data); +/* These correspond to 1 << X: 012345678901234567 */ +const char irc_user_mode_chars[] = "o iw dkg r "; + void irc_svsmode(struct userNode *target, char *modes, unsigned long stamp); struct server * @@ -241,16 +244,8 @@ irc_server(struct server *srv) { void irc_user(struct userNode *user) { char modes[32]; - int modelen = 0; if (!user || user->nick[0] != ' ') return; - if (IsOper(user)) modes[modelen++] = 'o'; - if (IsInvisible(user)) modes[modelen++] = 'i'; - if (IsWallOp(user)) modes[modelen++] = 'w'; - if (IsService(user)) modes[modelen++] = 'k'; - if (IsDeaf(user)) modes[modelen++] = 'd'; - if (IsReggedNick(user)) modes[modelen++] = 'r'; - if (IsGlobal(user)) modes[modelen++] = 'g'; - modes[modelen] = 0; + irc_user_modes(user, modes, sizeof(modes)); putsock("NICK %s %d %lu +%s %s %s %s %d %u :%s", user->nick, user->uplink->hops+2, (unsigned long)user->timestamp, modes, user->ident, user->hostname, user->uplink->name, 0, @@ -268,7 +263,7 @@ irc_account(struct userNode *user, UNUSED_ARG(const char *stamp), UNUSED_ARG(uns } void -irc_fakehost(UNUSED_ARG(struct userNode *user), UNUSED_ARG(const char *host)) +irc_fakehost(UNUSED_ARG(struct userNode *user), UNUSED_ARG(const char *host), UNUSED_ARG(const char *ident), UNUSED_ARG(int force)) { /* not supported in bahamut */ } @@ -1110,6 +1105,7 @@ void init_parse(void) { userList_init(&dead_users); reg_exit_func(parse_cleanup); + (void)call_xquery_funcs; } int parse_line(char *line, int recursive) { @@ -1235,7 +1231,7 @@ void mod_usermode(struct userNode *user, const char *mode_change) { } struct mod_chanmode * -mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, unsigned int flags, short base_oplevel) +mod_chanmode_parse(struct chanNode *channel, struct userNode *user, char **modes, unsigned int argc, unsigned int flags, short base_oplevel) { struct mod_chanmode *change; unsigned int ii, in_arg, ch_arg, add; @@ -1478,6 +1474,9 @@ char * mod_chanmode_format(struct mod_chanmode *change, char *outbuff) { unsigned int used = 0; + unsigned int args_used = 0; + char args[MAXLEN]; + assert(change->argc <= change->alloc_argc); if (change->modes_clear) { outbuff[used++] = '-'; @@ -1509,19 +1508,11 @@ mod_chanmode_format(struct mod_chanmode *change, char *outbuff) DO_MODE_CHAR(REGONLY, 'R'); DO_MODE_CHAR(NOCOLORS, 'c'); DO_MODE_CHAR(REGISTERED, 'r'); + DO_MODE_CHAR(LIMIT, 'l'), args_used += sprintf(args + args_used, " %d", change->new_limit); + DO_MODE_CHAR(KEY, 'k'), args_used += sprintf(args + args_used, " %s", change->new_key); #undef DO_MODE_CHAR - switch (change->modes_set & (MODE_KEY|MODE_LIMIT)) { - case MODE_KEY|MODE_LIMIT: - used += sprintf(outbuff+used, "lk %d %s", change->new_limit, change->new_key); - break; - case MODE_KEY: - used += sprintf(outbuff+used, "k %s", change->new_key); - break; - case MODE_LIMIT: - used += sprintf(outbuff+used, "l %d", change->new_limit); - break; - } } - outbuff[used] = 0; + args[args_used] = '\0'; + strcpy(outbuff + used, args); return outbuff; }