]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/helpfile.c
Couple of srvx updates.
[irc/evilnet/x3.git] / src / helpfile.c
index 1e095e17030a437fff15c3d3ef7ec7fc38ffa504..91e8f2891c543b46d093b2d6be6794efa59c565d 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
@@ -48,7 +48,7 @@ struct userNode *message_source;
 struct language *lang_C;
 struct dict *languages;
 
-static void language_cleanup(void)
+static void language_cleanup(UNUSED_ARG(void *extra))
 {
     dict_delete(languages);
 }
@@ -206,7 +206,7 @@ static struct language *language_read(const char *name)
     /* Read all the translations from the directory. */
     while ((dirent = readdir(dir))) {
         snprintf(filename, sizeof(filename), "languages/%s/%s", name, dirent->d_name);
-        if (!strcmp(dirent->d_name,"parent")) {
+        if (!strcmp(dirent->d_name, "parent")) {
             continue;
         } else if (!strcmp(dirent->d_name, "strings.db")) {
             dict = parse_database(filename);
@@ -236,6 +236,9 @@ static void language_read_list(void)
         if (dirent->d_name[0] == '.')
             continue;
         snprintf(namebuf, sizeof(namebuf), "languages/%s", dirent->d_name);
+        if (!strcmp(dirent->d_name, "strings.db")) {
+            continue;
+        }
         if (stat(namebuf, &sbuf) < 0) {
             log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (unable to stat).", dirent->d_name);
             continue;
@@ -244,7 +247,8 @@ static void language_read_list(void)
             log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (not directory).", dirent->d_name);
             continue;
         }
-        language_alloc(dirent->d_name);
+        if (!dict_find(languages, dirent->d_name, NULL))
+            language_alloc(dirent->d_name);
     }
     closedir(dir);
 }
@@ -308,10 +312,18 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu
 
     if (irc_send)
         {} /* use that function */
-    else if (hi)
+    else if(IsChannelName(to)) {
+        irc_send = irc_privmsg;
+    }
+    else if (message_dest->no_notice) {
+        irc_send = irc_privmsg;
+    }
+    else if (hi) {
         irc_send = HANDLE_FLAGGED(hi, USE_PRIVMSG) ? irc_privmsg : irc_notice;
-    else
-        irc_send = IsChannelName(to) ? irc_privmsg : irc_notice;
+    }
+    else {
+        irc_send = irc_notice;
+    }
 
     /* Limit size to how much we can show at once */
     if (size > sizeof(line))
@@ -381,9 +393,13 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu
     /* Send the table. */
     for (jj=0, pos=0, reps=0; ii<table.length; ) {
         while (1) {
+            int PAD_COL_LEFT = false;
+            if(table.flags & TABLE_PAD_LEFT || str_is_number(table.contents[ii][jj]))
+                PAD_COL_LEFT = true;
             len = strlen(table.contents[ii][jj]);
             spaces = max_width[jj] - len;
-            if (table.flags & TABLE_PAD_LEFT)
+            //if (table.flags & TABLE_PAD_LEFT)
+            if(PAD_COL_LEFT)
                 while (spaces--) line[pos++] = ' ';
             memcpy(line+pos, table.contents[ii][jj], len);
             pos += len;
@@ -396,7 +412,8 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu
                     break;
                 }
             }
-            if (!(table.flags & TABLE_PAD_LEFT))
+            //if (!(table.flags & TABLE_PAD_LEFT))
+            if(!PAD_COL_LEFT)
                 while (spaces--)
                     line[pos++] = ' ';
             line[pos++] = ' ';
@@ -407,7 +424,7 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu
         !(table.flags & TABLE_NO_FOOTER) && 
         !(hi && hi->userlist_style == HI_STYLE_CLEAN)) {
         char endstr[MAX_LINE_SIZE+1];
-        sprintf(endstr, "End (%d rows)", table.length);
+        sprintf(endstr, "End (%d rows)", table.length-1);
 
         /* Copy above into the sepstr, centered */
         if(sepsize > strlen(endstr)+2)
@@ -439,6 +456,8 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle
     unsigned int size, ipos, pos, length, chars_sent, use_color;
     unsigned int expand_pos, expand_ipos, newline_ipos;
     char line[MAX_LINE_SIZE];
+    struct service *service;
+    static char* trigger = NULL;
 
     if (IsChannelName(dest) || *dest == '$') {
         message_dest = NULL;
@@ -476,7 +495,10 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle
         size = DEFAULT_LINE_SIZE;
     switch (msg_type & 3) {
         case 0:
-            irc_send = irc_notice;
+            if(message_dest && message_dest->no_notice)
+               irc_send = irc_privmsg;
+            else
+               irc_send = irc_notice;
             break;
         case 2:
             irc_send = irc_wallchops;
@@ -494,7 +516,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle
     expand_pos = pos = 0;
     chars_sent = 0;
     while (input.list[ipos]) {
-       char ch, *value, *free_value;
+       char ch, *value = NULL, *free_value;
 
         while ((ch = input.list[ipos]) && (ch != '$') && (ch != '\n') && (pos < size)) {
            line[pos++] = ch;
@@ -548,6 +570,9 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle
        case 'b':
            value = use_color ? "\002" : "";
            break;
+       case 'k':
+           value = use_color ? "\003" : "";
+           break;
        case 'o':
            value = use_color ? "\017" : "";
            break;
@@ -579,9 +604,23 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle
         case 's':
             value = self->name;
             break;
+#ifdef HAVE_HELPSERV
+        case 'i':
+            value = strdup(get_helpserv_id(dest, src));
+            break;
+#endif
        case 'H':
            value = handle ? handle->handle : "Account";
            break;
+        case '!':  /* Command Char for chanserv */
+            if(!trigger)
+               trigger = calloc(sizeof(*trigger), 2);
+            if(chanserv && (service = service_find(chanserv->nick)))
+                trigger[0] = service->trigger;
+            else
+                trigger[0] = '!';
+            value = trigger;
+            break;
 #define SEND_LINE(TRUNCED) do { \
     line[pos] = 0; \
     if (pos > 0) { \
@@ -636,7 +675,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle
                 break;
             default:
                 value = "";
-                log_module(MAIN_LOG, LOG_ERROR, "Invalid exp.type %d from expansion function %p.", exp.type, expand_f);
+                log_module(MAIN_LOG, LOG_ERROR, "Invalid exp.type %d from expansion function %p.", exp.type, (void*)expand_f);
                 break;
             }
             ipos = name_end - input.list;
@@ -710,7 +749,7 @@ send_message(struct userNode *dest, struct userNode *src, const char *format, ..
     int res;
     va_list ap;
 
-    if (IsLocal(dest)) return 0;
+    if (IsLocal(dest) && !IsDummy(dest)) return 0;
     va_start(ap, format);
     res = vsend_message(dest->nick, src, dest->handle_info, 0, NULL, format, ap);
     va_end(ap);
@@ -722,7 +761,7 @@ send_message_type(int msg_type, struct userNode *dest, struct userNode *src, con
     int res;
     va_list ap;
 
-    if (IsLocal(dest)) return 0;
+    if (IsLocal(dest) && !IsDummy(dest)) return 0;
     va_start(ap, format);
     res = vsend_message(dest->nick, src, dest->handle_info, msg_type, NULL, format, ap);
     va_end(ap);
@@ -1131,10 +1170,27 @@ void helpfile_init(void)
     language_read_list();
 }
 
-void helpfile_finalize(void)
+static void helpfile_read_languages(void)
 {
     dict_iterator_t it;
+    dict_t dict;
+
+    language_read_list();
     for (it = dict_first(languages); it; it = iter_next(it))
         language_read(iter_key(it));
-    reg_exit_func(language_cleanup);
+
+    /* If the user has a strings.db in their languages directory,
+     * allow that to override C language strings.
+     */
+    dict = parse_database("languages/strings.db");
+    if (dict) {
+        language_set_messages(lang_C, dict);
+        free_database(dict);
+    }
+}
+
+void helpfile_finalize(void)
+{
+    conf_register_reload(helpfile_read_languages);
+    reg_exit_func(language_cleanup, NULL);
 }