aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-04-15 18:53:00 +0200
committertomsmeding <tom.smeding@gmail.com>2017-04-15 19:04:18 +0200
commit95eec6affee455e1ba935a1781495682b2ee7e9a (patch)
tree0bec9887dc2d36c04413e0e1a5afa1f11a076455
parente6bb11fc2801ca5be48ddceeecc5001cd5c39ef6 (diff)
weechat: Handle _push online
-rw-r--r--weechat/net.c20
-rw-r--r--weechat/net.h5
-rw-r--r--weechat/tomsg.c13
3 files changed, 37 insertions, 1 deletions
diff --git a/weechat/net.c b/weechat/net.c
index b8e3827..656a7a5 100644
--- a/weechat/net.c
+++ b/weechat/net.c
@@ -347,6 +347,26 @@ void net_handle_recv(int fd,const char *msg){
res.room[roomlen]='\0';
cb(fd,res,payload);
free(res.room);
+ } else if(cmdlen==6&&memcmp(cmd,"online",6)==0){
+ const char *q;
+ if(*p=='\0'||(q=strchr(p+1,' '))==NULL){
+ fprintf(debugf,"net_handle_recv: not enough arguments to 'online' <%s>\n",msg);
+ return;
+ }
+ const char *nump=p+1;
+ const char *usernamep=q+1;
+ const char *endp;
+ struct net_response res=(struct net_response){
+ .type=NET_ONLINE,
+ .online.username=strdup(usernamep),
+ .online.num=strtol(nump,(char**)&endp,10)
+ };
+ if(nump[0]==' '||*endp!=' '){
+ fprintf(debugf,"net_handle_recv: invalid number argument to 'online' <%s>\n",msg);
+ return;
+ }
+ cb(fd,res,payload);
+ free(res.online.username);
} else {
fprintf(debugf,"net_handle_recv: unknown command <%s>\n",msg);
}
diff --git a/weechat/net.h b/weechat/net.h
index 7e18f4c..335664c 100644
--- a/weechat/net.h
+++ b/weechat/net.h
@@ -15,6 +15,7 @@ enum net_response_type{
NET_MESSAGE,
NET_JOIN,
NET_INVITE,
+ NET_ONLINE,
};
struct net_history_item{
@@ -43,6 +44,10 @@ struct net_response{
i64 timestamp;
char *message;
};
+ struct {
+ char *username;
+ i64 num;
+ } online;
};
};
diff --git a/weechat/tomsg.c b/weechat/tomsg.c
index 01aa995..6e9042b 100644
--- a/weechat/tomsg.c
+++ b/weechat/tomsg.c
@@ -155,7 +155,6 @@ static void isonline_net_callback(int fd,struct net_response res,void *payload){
free(rn);
struct t_gui_nick *nickp=weechat_nicklist_search_nick(room->buffer,room->buffer_nickgroup,name);
- fprintf(debugf," nickp=%p: setting '%s' to '%s'\n",nickp,name,color);
free(name);
if(nickp==NULL)return;
weechat_nicklist_nick_set(room->buffer,nickp,"color",color);
@@ -232,6 +231,18 @@ static void push_net_callback(int fd,struct net_response res,void *payload){
} else {
assert(false);
}
+ } else if(res.type==NET_PONG){
+ // ok
+ } else if(res.type==NET_ONLINE){
+ fprintf(debugf," NET_ONLINE with username='%s' num='%" PRIi64 "'\n",res.online.username,res.online.num);
+ const char *color=res.online.num>0 ? "weechat.color.chat_nick" : "weechat.color.nicklist_away";
+ for(i64 i=0;i<conn->nrooms;i++){
+ struct t_gui_nick *nickp=weechat_nicklist_search_nick(
+ conn->rooms[i]->buffer,conn->rooms[i]->buffer_nickgroup,res.online.username);
+ if(nickp!=NULL){
+ weechat_nicklist_nick_set(conn->rooms[i]->buffer,nickp,"color",color);
+ }
+ }
} else {
fprintf(debugf,"push_net_callback: unknown response type %d\n",res.type);
}