fix TODO list, services without "description" fields
[srvx.git] / src / chanserv.c
index 32e7c0b48be1c331145d72bdcf7635e55b8622cd..1a4c6d6f011082f70a1adbc939a153fcb047ec1e 100644 (file)
@@ -3298,7 +3298,7 @@ static void
 zoot_list(struct listData *list)
 {
     struct userData *uData;
-    unsigned int start, curr;
+    unsigned int start, curr, highest, lowest;
     struct helpfile_table tmp_table;
     const char **temp, *msg;
 
@@ -3314,16 +3314,23 @@ zoot_list(struct listData *list)
     tmp_table.width = list->table.width;
     tmp_table.flags = list->table.flags;
     list->table.contents[0][0] = " ";
+    highest = list->highest;
+    if (list->lowest != 0)
+        lowest = list->lowest;
+    else if (highest < 100)
+        lowest = 1;
+    else
+        lowest = highest - 100;
     for(start = curr = 1; curr < list->table.length; )
     {
         uData = list->users[curr-1];
         list->table.contents[curr++][0] = " ";
-        if((curr == list->table.length) || (list->users[curr-1]->access != uData->access))
+        if((curr == list->table.length) || (list->users[curr-1]->access < lowest))
         {
             if(list->search)
-                send_message(list->user, list->bot, "CSMSG_ACCESS_SEARCH_HEADER", list->channel->name, list->lowest, list->highest, list->search);
+                send_message(list->user, list->bot, "CSMSG_ACCESS_SEARCH_HEADER", list->channel->name, lowest, highest, list->search);
             else
-                send_message(list->user, list->bot, "CSMSG_ACCESS_ALL_HEADER", list->channel->name, list->lowest, list->highest);
+                send_message(list->user, list->bot, "CSMSG_ACCESS_ALL_HEADER", list->channel->name, lowest, highest);
             temp = list->table.contents[--start];
             list->table.contents[start] = list->table.contents[0];
             tmp_table.contents = list->table.contents + start;
@@ -3331,6 +3338,8 @@ zoot_list(struct listData *list)
             table_send(list->bot, list->user->nick, 0, NULL, tmp_table);
             list->table.contents[start] = temp;
             start = curr;
+            highest = lowest - 1;
+            lowest = (highest < 100) ? 0 : (highest - 99);
         }
     }
 }
@@ -3448,7 +3457,7 @@ cmd_list_users(struct userNode *user, struct chanNode *channel, unsigned int arg
 
 static CHANSERV_FUNC(cmd_users)
 {
-    return cmd_list_users(CSFUNC_ARGS, 0, UL_OWNER);
+    return cmd_list_users(CSFUNC_ARGS, 1, UL_OWNER);
 }
 
 static CHANSERV_FUNC(cmd_wlist)
@@ -3460,14 +3469,17 @@ static CHANSERV_FUNC(cmd_clist)
 {
     return cmd_list_users(CSFUNC_ARGS, UL_COOWNER, UL_OWNER-1);
 }
+
 static CHANSERV_FUNC(cmd_mlist)
 {
     return cmd_list_users(CSFUNC_ARGS, UL_MASTER, UL_COOWNER-1);
 }
+
 static CHANSERV_FUNC(cmd_olist)
 {
     return cmd_list_users(CSFUNC_ARGS, UL_OP, UL_MASTER-1);
 }
+
 static CHANSERV_FUNC(cmd_plist)
 {
     return cmd_list_users(CSFUNC_ARGS, 1, UL_OP-1);
@@ -4937,7 +4949,7 @@ channel_level_option(enum levelOption option, struct userNode *user, struct chan
         value = user_level_from_name(argv[1], UL_OWNER+1);
         if(!value && !isdigit(argv[1][0]))
        {
-           reply("CSMSG_INVALID_ACCESS", index);
+           reply("CSMSG_INVALID_ACCESS", argv[1]);
             return 0;
         }
         uData = GetChannelUser(cData, user->handle_info);
@@ -6185,7 +6197,8 @@ chanserv_conf_read(void)
     str = database_get_data(conf_node, KEY_MAX_CHAN_BANS, RECDB_QSTRING);
     chanserv_conf.max_chan_bans = str ? atoi(str) : 512;
     str = database_get_data(conf_node, KEY_NICK, RECDB_QSTRING);
-    if(str) NickChange(chanserv, str, 0);
+    if(chanserv && str)
+        NickChange(chanserv, str, 0);
     str = database_get_data(conf_node, KEY_REFRESH_PERIOD, RECDB_QSTRING);
     chanserv_conf.refresh_period = str ? ParseInterval(str) : 3*60*60;
     str = database_get_data(conf_node, KEY_CTCP_SHORT_BAN_DURATION, RECDB_QSTRING);
@@ -6885,7 +6898,6 @@ chanserv_db_cleanup(void) {
 void
 init_chanserv(const char *nick)
 {
-    chanserv = AddService(nick, "Channel Services");
     CS_LOG = log_register_type("ChanServ", "file:chanserv.log");
     conf_register_reload(chanserv_conf_read);
 
@@ -6965,10 +6977,10 @@ init_chanserv(const char *nick)
     DEFINE_COMMAND(wipeinfo, 2, MODCMD_REQUIRE_CHANUSER, "access", "master", NULL);
     DEFINE_COMMAND(resync, 1, MODCMD_REQUIRE_CHANUSER, "access", "master", NULL);
 
-    DEFINE_COMMAND(events, 1, MODCMD_REQUIRE_REGCHAN, "flags", "+nolog", "access", "coowner", NULL);
-    DEFINE_COMMAND(addban, 2, MODCMD_REQUIRE_REGCHAN, "access", "master", NULL);
-    DEFINE_COMMAND(addtimedban, 3, MODCMD_REQUIRE_REGCHAN, "access", "master", NULL);
-    DEFINE_COMMAND(delban, 2, MODCMD_REQUIRE_REGCHAN, "access", "master", NULL);
+    DEFINE_COMMAND(events, 1, MODCMD_REQUIRE_REGCHAN, "flags", "+nolog", "access", "350", NULL);
+    DEFINE_COMMAND(addban, 2, MODCMD_REQUIRE_REGCHAN, "access", "250", NULL);
+    DEFINE_COMMAND(addtimedban, 3, MODCMD_REQUIRE_REGCHAN, "access", "250", NULL);
+    DEFINE_COMMAND(delban, 2, MODCMD_REQUIRE_REGCHAN, "access", "250", NULL);
     DEFINE_COMMAND(uset, 1, MODCMD_REQUIRE_CHANUSER, "access", "peon", NULL);
 
     DEFINE_COMMAND(bans, 1, MODCMD_REQUIRE_REGCHAN, "access", "peon", "flags", "+nolog", NULL);
@@ -7044,8 +7056,13 @@ init_chanserv(const char *nick)
 
     note_types = dict_new();
     dict_set_free_data(note_types, chanserv_deref_note_type);
+    if(nick)
+    {
+        chanserv = AddService(nick, "Channel Services");
+        service_register(chanserv, '!');
+        reg_chanmsg_func('\001', chanserv, chanserv_ctcp_check);
+    }
     saxdb_register("ChanServ", chanserv_saxdb_read, chanserv_saxdb_write);
-    reg_chanmsg_func('\001', chanserv, chanserv_ctcp_check);
 
     if(chanserv_conf.channel_expire_frequency)
        timeq_add(now + chanserv_conf.channel_expire_frequency, expire_channels, NULL);