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) {