diff --git a/cmake/ConkyPlatformChecks.cmake b/cmake/ConkyPlatformChecks.cmake index ca0498b0..421774af 100644 --- a/cmake/ConkyPlatformChecks.cmake +++ b/cmake/ConkyPlatformChecks.cmake @@ -95,7 +95,7 @@ if(BUILD_ICAL) endif(BUILD_ICAL) if(BUILD_IRC) - check_include_files(libircclient/libircclient.h IRC_H_) + check_include_files(libircclient.h IRC_H_) if(NOT IRC_H_) message(FATAL_ERROR "Unable to find libircclient") endif(NOT IRC_H_) diff --git a/doc/variables.xml b/doc/variables.xml index 7763fcae..7c5ebb8c 100644 --- a/doc/variables.xml +++ b/doc/variables.xml @@ -1758,11 +1758,12 @@ - + Shows everything that's being told in #channel on IRCserver 'server'. TCP-port 6667 is used for the connection unless 'port' is - specified. + specified. Shows everything since the last time or the last + 'max_msg_lines' entries if specified. diff --git a/src/irc.cc b/src/irc.cc index 17b81d73..a4fbf51d 100644 --- a/src/irc.cc +++ b/src/irc.cc @@ -29,7 +29,7 @@ #include #include #include "text_object.h" -#include +#include struct ll_text { char *text; @@ -44,6 +44,7 @@ struct obj_irc { struct ctx { char *chan; + int max_msg_lines; struct ll_text *messages; }; @@ -61,14 +62,34 @@ void addmessage(struct ctx *ctxptr, char *nick, const char *text) { newmsg->text = (char*) malloc(strlen(nick) + strlen(text) + 4); //4 = ": \n" sprintf(newmsg->text, "%s: %s\n", nick, text); newmsg->next = NULL; + int msgcnt = 1; if(!lastmsg) { ctxptr->messages = newmsg; } else { + msgcnt++; while(lastmsg->next) { lastmsg = lastmsg->next; + msgcnt++; + if(msgcnt<0) { + NORM_ERR("irc: too many messages, discarding the last one."); + free(newmsg->text); + free(newmsg); + return; + } } lastmsg->next = newmsg; } + if(ctxptr->max_msg_lines>0) { + newmsg = ctxptr->messages; + msgcnt -= ctxptr->max_msg_lines; + while((msgcnt>0) && (ctxptr->messages)) { + msgcnt--; + newmsg = ctxptr->messages->next; + free(ctxptr->messages->text); + free(ctxptr->messages); + ctxptr->messages = newmsg; + } + } } void ev_talkinchan(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count) { @@ -95,7 +116,7 @@ void ev_num(irc_session_t *session, unsigned int event, const char *origin, cons if(origin || count) {} //fix gcc warnings } -#define IRCSYNTAX "The correct syntax is ${irc server(:port) #channel}" +#define IRCSYNTAX "The correct syntax is ${irc server(:port) #channel (max_msg_lines)}" #define IRCPORT 6667 #define IRCNICK "conky" #define IRCSERVERPASS NULL @@ -108,6 +129,7 @@ void *ircclient(void *ptr) { irc_callbacks_t callbacks; char *server; char *strport; + char *str_max_msg_lines; unsigned int port; memset (&callbacks, 0, sizeof(callbacks)); @@ -120,6 +142,10 @@ void *ircclient(void *ptr) { if( ! ctxptr->chan) { NORM_ERR("irc: %s", IRCSYNTAX); } + str_max_msg_lines = strtok(NULL, " "); + if(str_max_msg_lines) { + ctxptr->max_msg_lines = strtol(str_max_msg_lines, NULL, 10); + } ctxptr->messages = NULL; irc_set_ctx(ircobj->session, ctxptr); server = strtok(server, ":"); @@ -169,14 +195,18 @@ void print_irc(struct text_object *obj, char *p, int p_max_size) { while(curmsg) { nextmsg = curmsg->next; strncat(p, curmsg->text, p_max_size - strlen(p) - 1); - free(curmsg->text); - free(curmsg); + if(!ctxptr->max_msg_lines) { + free(curmsg->text); + free(curmsg); + } curmsg = nextmsg; } if(p[0] != 0) { p[strlen(p) - 1] = 0; } - ctxptr->messages = NULL; + if(!ctxptr->max_msg_lines) { + ctxptr->messages = NULL; + } } void free_irc(struct text_object *obj) {