]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/mod-helpserv.c
added levels command
[irc/evilnet/x3.git] / src / mod-helpserv.c
index 1a8efc5d9e1cca5c1736ea1f07c6192a0f5b389e..25574585690c869dca3203934698307f1e60ef38 100644 (file)
@@ -1,9 +1,9 @@
 /* mod-helpserv.c - Support Helper assistant service
  * Copyright 2002-2003 srvx Development Team
  *
- * This file is part of srvx.
+ * This file is part of x3.
  *
- * srvx is free software; you can redistribute it and/or modify
+ * x3 is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
@@ -218,6 +218,7 @@ static const struct message_entry msgtab[] = {
     { "HSMSG_REQ_PERSIST_PART", "Everything you tell me until you are helped (or you leave %s) will be recorded. If you part %s, your request will be lost." },
     { "HSMSG_REQ_PERSIST_HANDLE", "Everything you tell me until you are helped will be recorded." },
     { "HSMSG_REQ_MAXLEN", "Sorry, but your request has reached the maximum number of lines. Please wait to be assigned to a helper and continue explaining your request to them." },
+    { "HSMSQ_REQ_TEXT_ADDED", "Message from $b%s:$b %s" },
     { "HSMSG_REQ_FOUND_ANOTHER", "Request ID#%lu has been closed. $S detected that you also have request ID#%lu open. If you send $S a message, it will be associated with that request." },
 
 /* Messages that are inserted into request text */
@@ -958,7 +959,7 @@ static struct helpserv_request * create_request(struct userNode *user, struct he
     else
         send_message_type(4, user, hs->helpserv, "%s %s %s", lbuf[0], lbuf[1], lbuf[2]);
 
-    if (hs->req_on_join && req == hs->unhandled && hs->helpchan_empty) {
+    if (hs->req_on_join && req == hs->unhandled && hs->helpchan_empty && !user->uplink->burst) {
         timeq_del(0, run_empty_interval, hs, TIMEQ_IGNORE_WHEN);
         run_empty_interval(hs);
     }
@@ -1072,7 +1073,7 @@ static void helpserv_usermsg(struct userNode *user, struct helpserv_bot *hs, cha
             if (user->handle_info)
                 helpserv_notify(req->helper, "HSMSG_PAGE_UPD_REQUEST_AUTHED", req->id, user->nick, user->handle_info->handle, timestr, updatestr);
             else
-                helpserv_notify(req->helper, "HSMSG_PAGE_UPD_REQUESTNOT_AUTHED", req->id, user->nick, timestr, updatestr);
+                helpserv_notify(req->helper, "HSMSG_PAGE_UPD_REQUEST_NOT_AUTHED", req->id, user->nick, timestr, updatestr);
         else
             if (user->handle_info)
                 helpserv_page(PGSRC_STATUS, "HSMSG_PAGE_UPD_REQUEST_AUTHED", req->id, user->nick, user->handle_info->handle, timestr, updatestr);
@@ -1085,7 +1086,22 @@ static void helpserv_usermsg(struct userNode *user, struct helpserv_bot *hs, cha
 
     req->updated = now;
     if (!hs->req_maxlen || req->text->used < hs->req_maxlen)
+    {
         string_list_append(req->text, strdup(text));
+
+        struct userNode *likely_helper;
+        /* Find somebody likely to be the helper */
+        if (!req->helper)
+            likely_helper = NULL;
+        else if ((likely_helper = req->helper->handle->users) && !likely_helper->next_authed) {
+            /* only one user it could be :> */
+        } else for (likely_helper = req->helper->handle->users; likely_helper; likely_helper = likely_helper->next_authed)
+            if (GetUserMode(hs->helpchan, likely_helper))
+                break;
+
+        if(likely_helper)
+            send_target_message(1, likely_helper->nick, hs->helpserv, "HSMSQ_REQ_TEXT_ADDED", user->nick, text);
+    }
     else
         helpserv_msguser(user, "HSMSG_REQ_MAXLEN");
 }
@@ -1392,7 +1408,7 @@ static int show_helper_range(struct userNode *user, struct helpserv_bot *hs, int
     struct helpfile_table tbl;
     struct helpserv_user *hs_user;
     dict_iterator_t it;
-    enum helpserv_level last_level;
+/*    enum helpserv_level last_level; Zoot style */
     unsigned int ii;
 
     users.used = 0;
@@ -1413,7 +1429,8 @@ static int show_helper_range(struct userNode *user, struct helpserv_bot *hs, int
     }
     qsort(users.list, users.used, sizeof(users.list[0]), helpserv_user_comp);
     switch (user->handle_info->userlist_style) {
-    case HI_STYLE_DEF:
+    default:
+    case HI_STYLE_NORMAL:
         tbl.length = users.used + 1;
         tbl.width = 3;
         tbl.flags = TABLE_NO_FREE;
@@ -1431,6 +1448,7 @@ static int show_helper_range(struct userNode *user, struct helpserv_bot *hs, int
         }
         table_send((from_opserv ? opserv : hs->helpserv), user->nick, 0, NULL, tbl);
         break;
+    /*
     case HI_STYLE_ZOOT: default:
         last_level = HlNone;
         tbl.length = 0;
@@ -1454,6 +1472,7 @@ static int show_helper_range(struct userNode *user, struct helpserv_bot *hs, int
             helpserv_notice(user, "HSMSG_USERLIST_ZOOT_LVL", hs->helpserv->nick, helpserv_level_names[last_level]);
             table_send((from_opserv ? opserv : hs->helpserv), user->nick, 0, NULL, tbl);
         }
+        */
     }
     return 1;
 }
@@ -1550,7 +1569,7 @@ static void free_request(void *data) {
 
     /* Logging */
     if (shutting_down && (req->hs->persist_types[PERSIST_T_REQUEST] != PERSIST_CLOSE || !req->handle)) {
-        helpserv_log_request(req, "srvx shutdown");
+        helpserv_log_request(req, "X3 shutdown");
     }
 
     /* Clean up from the unhandled queue */
@@ -1676,7 +1695,7 @@ static HELPSERV_FUNC(cmd_close) {
             mod_chanmode_init(&change);
             change.argc = 1;
             change.args[0].mode = MODE_REMOVE | MODE_VOICE;
-            change.args[0].member = mn;
+            change.args[0].u.member = mn;
             mod_chanmode_announce(hs->helpserv, hs->helpchan, &change);
         }
     }
@@ -1880,7 +1899,7 @@ static int helpserv_assign(int from_opserv, struct helpserv_bot *hs, struct user
         mod_chanmode_init(&change);
         change.argc = 1;
         change.args[0].mode = MODE_VOICE;
-        if ((change.args[0].member = GetUserMode(hs->helpchan, req->user)))
+        if ((change.args[0].u.member = GetUserMode(hs->helpchan, req->user)))
             mod_chanmode_announce(hs->helpserv, hs->helpchan, &change);
     }
 
@@ -1904,8 +1923,6 @@ static HELPSERV_FUNC(cmd_show) {
 
     REQUIRE_PARMS(2);
 
-    assert(hs_user);
-
     if (!(req = smart_get_request(hs, hs_user, argv[1], &num_requests))) {
         helpserv_notice(user, "HSMSG_REQ_INVALID", argv[1]);
         return 0;
@@ -1990,8 +2007,6 @@ static HELPSERV_FUNC(cmd_addnote) {
 
     REQUIRE_PARMS(3);
 
-    assert(hs_user);
-
     if (!(req = smart_get_request(hs, hs_user, argv[1], &num_requests))) {
         helpserv_notice(user, "HSMSG_REQ_INVALID", argv[1]);
         return 0;
@@ -2201,7 +2216,7 @@ static HELPSERV_FUNC(cmd_move) {
     REQUIRE_PARMS(2);
 
     if (is_valid_nick(argv[1])) {
-        char *newnick = argv[1], oldnick[NICKLEN], reason[MAXLEN];
+        char *newnick = argv[1], oldnick[NICKLEN];
 
         strcpy(oldnick, hs->helpserv->nick);
 
@@ -2216,8 +2231,8 @@ static HELPSERV_FUNC(cmd_move) {
 
         helpserv_notice(user, "HSMSG_RENAMED", oldnick, newnick);
 
-        snprintf(reason, MAXLEN, "HelpServ bot %s (in %s) renamed to %s by %s.", oldnick, hs->helpchan->name, newnick, user->nick);
-        global_message(MESSAGE_RECIPIENT_OPERS, reason);
+        global_message_args(MESSAGE_RECIPIENT_OPERS, "HSMSG_BOT_RENAMED", oldnick,
+                            hs->helpchan->name, newnick, user->nick);
 
         return 1;
     } else if (IsChannelName(argv[1])) {
@@ -2250,14 +2265,14 @@ static HELPSERV_FUNC(cmd_move) {
         }
 
         if (!(hs->helpchan = GetChannel(newchan))) {
-            hs->helpchan = AddChannel(newchan, now, NULL, NULL);
+            hs->helpchan = AddChannel(newchan, now, NULL, NULL, NULL);
             AddChannelUser(hs->helpserv, hs->helpchan)->modes |= MODE_CHANOP;
         } else if (!helpserv_in_channel(hs, old_helpchan)) {
             struct mod_chanmode change;
             mod_chanmode_init(&change);
             change.argc = 1;
             change.args[0].mode = MODE_CHANOP;
-            change.args[0].member = AddChannelUser(hs->helpserv, hs->helpchan);
+            change.args[0].u.member = AddChannelUser(hs->helpserv, hs->helpchan);
             mod_chanmode_announce(hs->helpserv, hs->helpchan, &change);
         }
 
@@ -2267,8 +2282,8 @@ static HELPSERV_FUNC(cmd_move) {
         }
         helpserv_botlist_append(botlist, hs);
 
-        snprintf(reason, MAXLEN, "HelpServ %s (%s) moved to %s by %s.", hs->helpserv->nick, oldchan, newchan, user->nick);
-        global_message(MESSAGE_RECIPIENT_OPERS, reason);
+        global_message_args(MESSAGE_RECIPIENT_OPERS, "HSMSG_BOT_MOVED", hs->helpserv->nick,
+                            oldchan, newchan, user->nick);
 
         return 1;
     } else {
@@ -2336,7 +2351,7 @@ static void helpserv_page_helper_gone(struct helpserv_bot *hs, struct helpserv_r
             mod_chanmode_init(&change);
             change.argc = 1;
             change.args[0].mode = MODE_REMOVE | MODE_VOICE;
-            change.args[0].member = mn;
+            change.args[0].u.member = mn;
             mod_chanmode_announce(hs->helpserv, hs->helpchan, &change);
         }
         if(req->handle)
@@ -2603,7 +2618,7 @@ static struct helpserv_bot *register_helpserv(const char *nick, const char *help
      * it's a harmless default */
     hs = calloc(1, sizeof(struct helpserv_bot));
 
-    if (!(hs->helpserv = AddService(nick, helpserv_conf.description, NULL))) {
+    if (!(hs->helpserv = AddService(nick, "+iok", helpserv_conf.description, NULL))) {
         free(hs);
         return NULL;
     }
@@ -2611,14 +2626,14 @@ static struct helpserv_bot *register_helpserv(const char *nick, const char *help
     reg_privmsg_func(hs->helpserv, helpserv_botmsg);
 
     if (!(hs->helpchan = GetChannel(help_channel))) {
-        hs->helpchan = AddChannel(help_channel, now, NULL, NULL);
+        hs->helpchan = AddChannel(help_channel, now, NULL, NULL, NULL);
         AddChannelUser(hs->helpserv, hs->helpchan)->modes |= MODE_CHANOP;
     } else {
         struct mod_chanmode change;
         mod_chanmode_init(&change);
         change.argc = 1;
         change.args[0].mode = MODE_CHANOP;
-        change.args[0].member = AddChannelUser(hs->helpserv, hs->helpchan);
+        change.args[0].u.member = AddChannelUser(hs->helpserv, hs->helpchan);
         mod_chanmode_announce(hs->helpserv, hs->helpchan, &change);
     }
 
@@ -2644,7 +2659,7 @@ static struct helpserv_bot *register_helpserv(const char *nick, const char *help
 }
 
 static HELPSERV_FUNC(cmd_register) {
-    char *nick, *helpchan, reason[MAXLEN];
+    char *nick, *helpchan;
     struct handle_info *handle;
 
     REQUIRE_PARMS(4);
@@ -2680,9 +2695,9 @@ static HELPSERV_FUNC(cmd_register) {
 
     helpserv_notice(user, "HSMSG_REG_SUCCESS", handle->handle, nick);
 
-    snprintf(reason, MAXLEN, "HelpServ %s (%s) registered to %s by %s.", nick, hs->helpchan->name, handle->handle, user->nick);
     /* Not sent to helpers, since they can't register HelpServ */
-    global_message(MESSAGE_RECIPIENT_OPERS, reason);
+    global_message_args(MESSAGE_RECIPIENT_OPERS, "HSMSG_BOT_REGISTERED", nick,
+                        hs->helpchan->name, handle->handle, user->nick);
     return 1;
 }
 
@@ -2723,8 +2738,7 @@ static void helpserv_unregister(struct helpserv_bot *bot, const char *quit_fmt,
     snprintf(reason, sizeof(reason), quit_fmt, actor);
     DelUser(bot->helpserv, NULL, 1, reason);
     dict_remove(helpserv_bots_dict, botname);
-    snprintf(reason, sizeof(reason), global_fmt, botname, channame, actor);
-    global_message(MESSAGE_RECIPIENT_OPERS, reason);
+    global_message_args(MESSAGE_RECIPIENT_OPERS, global_fmt, botname, channame, actor);
 }
 
 static HELPSERV_FUNC(cmd_unregister) {
@@ -2736,7 +2750,7 @@ static HELPSERV_FUNC(cmd_unregister) {
         log_audit(HS_LOG, LOG_COMMAND, user, hs->helpserv, hs->helpchan->name, 0, "unregister CONFIRM");
     }
 
-    helpserv_unregister(hs, "Unregistered by %s", "HelpServ %s (%s) unregistered by %s.", user->nick);
+    helpserv_unregister(hs, "Unregistered by %s", "HSMSG_BOT_UNREGISTERED", user->nick);
     return from_opserv;
 }
 
@@ -2752,7 +2766,7 @@ static HELPSERV_FUNC(cmd_expire) {
         next = iter_next(it);
         if ((unsigned int)(now - bot->last_active) < helpserv_conf.expire_age)
             continue;
-        helpserv_unregister(bot, "Registration expired due to inactivity", "HelpServ %s (%s) expired at request of %s.", user->nick);
+        helpserv_unregister(bot, "Registration expired due to inactivity", "HSMSG_BOT_EXPIRED", user->nick);
         count++;
     }
     helpserv_notice(user, "HSMSG_EXPIRATION_DONE", count);
@@ -2858,7 +2872,7 @@ static void set_page_target(struct helpserv_bot *hs, enum page_source idx, const
         }
         new_target = GetChannel(target);
         if (!new_target) {
-            new_target = AddChannel(target, now, NULL, NULL);
+            new_target = AddChannel(target, now, NULL, NULL, NULL);
             AddChannelUser(hs->helpserv, new_target);
         }
     } else {
@@ -2875,7 +2889,7 @@ static void set_page_target(struct helpserv_bot *hs, enum page_source idx, const
         mod_chanmode_init(&change);
         change.argc = 1;
         change.args[0].mode = MODE_CHANOP;
-        change.args[0].member = AddChannelUser(hs->helpserv, new_target);
+        change.args[0].u.member = AddChannelUser(hs->helpserv, new_target);
         mod_chanmode_announce(hs->helpserv, new_target, &change);
     }
     hs->page_targets[idx] = new_target;
@@ -3652,7 +3666,7 @@ static void helpserv_conf_read(void) {
     helpserv_conf.db_backup_frequency = str ? ParseInterval(str) : 7200;
 
     str = database_get_data(conf_node, "description", RECDB_QSTRING);
-    helpserv_conf.description = str;
+    helpserv_conf.description = str ? str : "Help Queue Manager";
 
     str = database_get_data(conf_node, "reqlogfile", RECDB_QSTRING);
     if (str && strlen(str))
@@ -3906,7 +3920,7 @@ static void associate_requests_bybot(struct helpserv_bot *hs, struct userNode *u
             mod_chanmode_init(&change);
             change.argc = 1;
             change.args[0].mode = MODE_VOICE;
-            if ((change.args[0].member = GetUserMode(hs->helpchan, user)))
+            if ((change.args[0].u.member = GetUserMode(hs->helpchan, user)))
                 mod_chanmode_announce(hs->helpserv, hs->helpchan, &change);
         }
     }