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 *
-AddServer(struct server *uplink, const char *name, int hops, unsigned long boot, unsigned long link, UNUSED_ARG(const char *numeric), const char *description) {
+AddServer(struct server *uplink, const char *name, int hops, unsigned long boot, unsigned long link_time, UNUSED_ARG(const char *numeric), const char *description) {
struct server* sNode;
sNode = calloc(1, sizeof(*sNode));
safestrncpy(sNode->name, name, sizeof(sNode->name));
sNode->hops = hops;
sNode->boot = boot;
- sNode->link = link;
+ sNode->link_time = link_time;
sNode->users = dict_new();
safestrncpy(sNode->description, description, sizeof(sNode->description));
serverList_init(&sNode->children);
if (dummy) uNode->modes |= FLAGS_DUMMY;
if (stamp) call_account_func(uNode, NULL, 0, stamp);
if (IsLocal(uNode)) irc_user(uNode);
- for (nn=0; (nn<nuf_used) && !uNode->dead; nn++) {
- if (nuf_list[nn](uNode)) break;
- }
+ for (nn=0; (nn<nuf_used) && !uNode->dead; nn++)
+ nuf_list[nn](uNode);
return uNode;
}
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,
}
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 */
}
userList_init(&dead_users);
reg_exit_func(parse_cleanup);
+ (void)call_xquery_funcs;
}
int parse_line(char *line, int recursive) {
}
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;
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++] = '-';
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;
}