X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/338a82b57f928abe592145115f990d63b9e787d0..3f5b88017d6667911c6a82a82ffd3f967690347e:/src/helpfile.c diff --git a/src/helpfile.c b/src/helpfile.c index fcd94cd..37a51e1 100644 --- a/src/helpfile.c +++ b/src/helpfile.c @@ -3,7 +3,7 @@ * * 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. @@ -23,6 +23,7 @@ #include "log.h" #include "modcmd.h" #include "nickserv.h" +#include "spamserv.h" #if defined(HAVE_DIRENT_H) #include @@ -41,7 +42,7 @@ static const struct message_entry msgtab[] = { #define DEFAULT_LINE_SIZE MAX_LINE_SIZE #define DEFAULT_TABLE_SIZE 80 -extern struct userNode *global, *chanserv, *opserv, *nickserv; +extern struct userNode *global, *chanserv, *opserv, *nickserv, *spamserv; struct userNode *message_dest; struct userNode *message_source; struct language *lang_C; @@ -171,8 +172,10 @@ static struct language *language_read(const char *name) /* Open the directory stream; if we can't, fail. */ snprintf(filename, sizeof(filename), "languages/%s", name); - if (!(dir = opendir(filename))) + if (!(dir = opendir(filename))) { + log_module(MAIN_LOG, LOG_ERROR, "Unable to open language directory languages/%s: %s", name, strerror(errno)); return NULL; + } if (!(lang = dict_find(languages, name, NULL))) lang = language_alloc(name); @@ -222,28 +225,25 @@ static struct language *language_read(const char *name) static void language_read_list(void) { + struct stat sbuf; struct dirent *dirent; DIR *dir; + char namebuf[MAXLEN]; if (!(dir = opendir("languages"))) return; while ((dirent = readdir(dir))) { if (dirent->d_name[0] == '.') continue; -#ifdef HAVE_DIRENT_D_TYPE - if (dirent->d_type != DT_DIR) + snprintf(namebuf, sizeof(namebuf), "languages/%s", dirent->d_name); + if (stat(namebuf, &sbuf) < 0) { + log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (unable to stat).", dirent->d_name); + continue; + } + if (!S_ISDIR(sbuf.st_mode)) { + log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (not directory).", dirent->d_name); continue; -#else - { - char namebuf[MAXLEN]; - struct stat sbuf; - snprintf(namebuf, sizeof(namebuf), "languages/%s", dirent->d_name); - if (stat(namebuf, &sbuf) < 0) - continue; - if (!S_ISDIR(sbuf.st_mode)) - continue; } -#endif language_alloc(dirent->d_name); } closedir(dir); @@ -276,7 +276,7 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu char line[MAX_LINE_SIZE+1]; struct handle_info *hi; char *sepstr = NULL; - int sepsize = 0; + unsigned int sepsize = 0; if (IsChannelName(to) || *to == '$') { message_dest = NULL; @@ -360,16 +360,21 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu line[pos++] = ' '; line[pos++] = ' '; } + line[pos++] = ' '; } line[pos] = 0; - sepsize = strlen_vis(line); - sepstr = malloc(sepsize + 1); - memset(sepstr, '-', sepsize); - sepstr[sepsize] = 0; - if(hi->userlist_style != HI_STYLE_CLEAN) + + /* Dont show ---- bars in 'clean' style. */ + if(!(hi && hi->userlist_style == HI_STYLE_CLEAN)) { + //sepsize = strlen_vis(line); + sepsize = tot_width * nreps; + sepstr = malloc(sepsize + 1); + memset(sepstr, '-', sepsize); + sepstr[sepsize] = 0; irc_send(from, to, sepstr); /* ----------------- */ - irc_send(from, to, line); /* alpha beta roe */ - if(hi->userlist_style != HI_STYLE_CLEAN) + } + irc_send(from, to, line); /* alpha beta roe */ + if(!(hi && hi->userlist_style == HI_STYLE_CLEAN)) irc_send(from, to, sepstr); /* ----------------- */ ii = 1; } @@ -397,20 +402,27 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu line[pos++] = ' '; } } - if (!(table.flags & TABLE_NO_HEADERS)) { - /* Send end bar & free its memory */ - if(sepsize > 5) + /* Send end bar */ + if (!(table.flags & TABLE_NO_HEADERS) && + !(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-1); + + /* Copy above into the sepstr, centered */ + if(sepsize > strlen(endstr)+2) { - sepstr[sepsize/2-1] = 'E'; - sepstr[sepsize/2] = 'n'; - sepstr[sepsize/2+1]= 'd'; + char* eptr = endstr; + char* sptr = sepstr+(sepsize/2) - (strlen(endstr)+2)/2; + while(*eptr) + *sptr++ = *eptr++; } - - if(hi->userlist_style != HI_STYLE_CLEAN) - irc_send(from, to, sepstr); - free(sepstr); + irc_send(from, to, sepstr); } + if(!(hi && hi->userlist_style == HI_STYLE_CLEAN)) + free(sepstr); + if (!(table.flags & TABLE_NO_FREE)) { /* Deallocate table memory (but not the string memory). */ for (ii=0; iinick : "NickServ"; break; + case 'X': + value = spamserv ? spamserv->nick : "SpamServ"; + break; case 's': value = self->name; break; @@ -888,7 +903,7 @@ helpfile_eval_identifier(const char *start, const char **end) *end = start + 5; return 0; } else { - log_module(MAIN_LOG, LOG_FATAL, "Unexpected helpfile identifier '%.*s'.", *end-start, start); + log_module(MAIN_LOG, LOG_FATAL, "Unexpected helpfile identifier '%.*s'.", (int)(*end-start), start); return -1; } } @@ -920,7 +935,7 @@ helpfile_eval_atomicexpr(const char *start, const char **end) while (isspace(*sep) && (sep < *end)) sep++; if ((sep == *end) || (sep[0] != ')')) { - log_module(MAIN_LOG, LOG_FATAL, "Expected close parenthesis at '%.*s'.", *end-sep, sep); + log_module(MAIN_LOG, LOG_FATAL, "Expected close parenthesis at '%.*s'.", (int)(*end-sep), sep); return -1; } @@ -957,7 +972,7 @@ helpfile_eval_expr(const char *start, const char **end) sep += len; } if (op == OP_INVALID) { - log_module(MAIN_LOG, LOG_FATAL, "Unrecognized helpfile operator at '%.*s'.", *end-sep, sep); + log_module(MAIN_LOG, LOG_FATAL, "Unrecognized helpfile operator at '%.*s'.", (int)(*end-sep), sep); return -1; } @@ -971,7 +986,7 @@ helpfile_eval_expr(const char *start, const char **end) while (isspace(*sep2) && (sep2 < *end)) sep2++; if (sep2 != *end) { - log_module(MAIN_LOG, LOG_FATAL, "Trailing garbage in helpfile expression: '%.*s'.", *end-sep2, sep2); + log_module(MAIN_LOG, LOG_FATAL, "Trailing garbage in helpfile expression: '%.*s'.", (int)(*end-sep2), sep2); return -1; } @@ -998,7 +1013,7 @@ helpfile_eval_condition(const char *start, const char **end) for (term = start; isalnum(*term) && (term < *end); ++term) ; if (term != start) { if ((term + 2 >= *end) || (term[0] != ':') || (term[1] != ' ')) { - log_module(MAIN_LOG, LOG_FATAL, "In helpfile condition '%.*s' expected prefix to end with ': '.", *end-start, start); + log_module(MAIN_LOG, LOG_FATAL, "In helpfile condition '%.*s' expected prefix to end with ': '.",(int)(*end-start), start); return -1; } start = term + 2;