X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/d76ed9a966ee3d955c8ef00ecc02e643c2005e2e..de9510bcaba3fc0377e09259f8b49921c421d269:/src/helpfile.c diff --git a/src/helpfile.c b/src/helpfile.c index a08c7b7..978a3af 100644 --- a/src/helpfile.c +++ b/src/helpfile.c @@ -1,7 +1,7 @@ /* helpfile.c - Help file loading and display * Copyright 2000-2004 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 * it under the terms of the GNU General Public License as published by @@ -261,11 +261,22 @@ const char *language_find_message(struct language *lang, const char *msgid) { return NULL; } +int strlen_vis(char *str) +{ + int count; + for(count=0;*str;str++) + if(!iscntrl(*str)) + count++; + return count; +} + void table_send(struct userNode *from, const char *to, unsigned int size, irc_send_func irc_send, struct helpfile_table table) { unsigned int ii, jj, len, nreps, reps, tot_width, pos, spaces, *max_width; char line[MAX_LINE_SIZE+1]; struct handle_info *hi; + char *sepstr = NULL; + int sepsize = 0; if (IsChannelName(to) || *to == '$') { message_dest = NULL; @@ -334,12 +345,14 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu for (pos=ii=0; ii<((table.flags & TABLE_REPEAT_HEADERS)?nreps:1); ii++) { for (jj=0; 1; ) { len = strlen(table.contents[0][jj]); + //line[pos++] = '\02'; /* bold header */ spaces = max_width[jj] - len; if (table.flags & TABLE_PAD_LEFT) while (spaces--) line[pos++] = ' '; memcpy(line+pos, table.contents[0][jj], len); pos += len; + //line[pos++] = '\02'; /* end bold header */ if (++jj == table.width) break; if (!(table.flags & TABLE_PAD_LEFT)) @@ -349,7 +362,13 @@ table_send(struct userNode *from, const char *to, unsigned int size, irc_send_fu } } line[pos] = 0; - irc_send(from, to, line); + sepsize = strlen_vis(line); + sepstr = malloc(sepsize + 1); + memset(sepstr, '-', sepsize); + sepstr[sepsize] = 0; + irc_send(from, to, sepstr); /* ----------------- */ + irc_send(from, to, line); /* alpha beta roe */ + irc_send(from, to, sepstr); /* ----------------- */ ii = 1; } /* Send the table. */ @@ -376,6 +395,18 @@ 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) + { + sepstr[sepsize/2-1] = 'E'; + sepstr[sepsize/2] = 'n'; + sepstr[sepsize/2+1]= 'd'; + } + irc_send(from, to, sepstr); + free(sepstr); + } + if (!(table.flags & TABLE_NO_FREE)) { /* Deallocate table memory (but not the string memory). */ for (ii=0; iihandle : "Account"; break; -#define SEND_LINE() do { line[pos] = 0; if (pos > 0) irc_send(src, dest, line); chars_sent += pos; pos = 0; newline_ipos = ipos; } while (0) +#define SEND_LINE(TRUNCED) do { \ + line[pos] = 0; \ + if (pos > 0) { \ + if (!(msg_type & MSG_TYPE_MULTILINE) && (pos > 1) && TRUNCED) \ + line[pos-2] = line[pos-1] = '.'; \ + irc_send(src, dest, line); \ + } \ + chars_sent += pos; \ + pos = 0; \ + newline_ipos = ipos; \ + if (!(msg_type & MSG_TYPE_MULTILINE)) return chars_sent; \ +} while (0) /* Custom expansion handled by helpfile-specific function. */ case '{': case '(': { @@ -568,7 +611,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle break; case HF_TABLE: /* Must send current line, then emit table. */ - SEND_LINE(); + SEND_LINE(0); table_send(src, (message_dest ? message_dest->nick : dest), 0, irc_send, exp.value.table); value = ""; break; @@ -606,7 +649,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle /* word to send is too big to send now.. what to do? */ if (pos > 0) { /* try to put it on a separate line */ - SEND_LINE(); + SEND_LINE(1); } else { /* already at start of line; only send part of it */ strncpy(line, value, avail); @@ -619,7 +662,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle } /* if we're looking at a newline, send the accumulated text */ if (*value == '\n') { - SEND_LINE(); + SEND_LINE(0); value++; } } @@ -636,7 +679,7 @@ vsend_message(const char *dest, struct userNode *src, struct handle_info *handle send_line: expand_pos = pos; expand_ipos = ipos; - SEND_LINE(); + SEND_LINE(0); #undef SEND_LINE } return chars_sent; @@ -686,7 +729,7 @@ _send_help(struct userNode *dest, struct userNode *src, expand_func_t expand, co va_list ap; va_start(ap, format); - res = vsend_message(dest->nick, src, dest->handle_info, 4, expand, format, ap); + res = vsend_message(dest->nick, src, dest->handle_info, 12, expand, format, ap); va_end(ap); return res; } @@ -722,6 +765,48 @@ send_help(struct userNode *dest, struct userNode *src, struct helpfile *hf, cons return _send_help(dest, src, hf->expand, rec->d.qstring); } +int +send_help_brief(struct userNode *dest, struct userNode *src, struct helpfile *hf, const char *topic) +{ + struct helpfile *lang_hf; + struct record_data *rec; + struct language *curr; + + if (!topic) + topic = ""; + if (!hf) { + _send_help(dest, src, NULL, "HFMSG_MISSING_HELPFILE"); + return 0; + } + for (curr = (dest->handle_info ? dest->handle_info->language : lang_C); + curr; + curr = curr->parent) { + lang_hf = dict_find(curr->helpfiles, hf->name, NULL); + if (!lang_hf) + continue; + rec = dict_find(lang_hf->db, topic, NULL); + if (rec && rec->type == RECDB_QSTRING) + { + char* buf; + int res; + + buf = malloc(strlen(rec->d.qstring) + 1); + strcpy(buf, rec->d.qstring); + *strchr(buf, '\n') = 0; + + res = _send_help(dest, src, hf->expand, buf); + free(buf); + return res; + } + } + rec = dict_find(hf->db, "", NULL); + if (!rec) + return send_message(dest, src, "MSG_TOPIC_UNKNOWN"); + if (rec->type != RECDB_QSTRING) + return send_message(dest, src, "HFMSG_HELP_NOT_STRING"); + return _send_help(dest, src, hf->expand, rec->d.qstring); +} + /* Grammar supported by this parser: * condition = expr | prefix expr * expr = atomicexpr | atomicexpr op atomicexpr