#define _ChanUser_h
#include "main.h"
-#define CHANUSERFLAG_OPPED 0x01
-#define CHANUSERFLAG_VOICED 0x02
+#define CHANUSERFLAG_OPPED 0x01
+#define CHANUSERFLAG_VOICED 0x02
#define CHANUSERFLAG_INVISIBLE 0x04
#define CHANUSERFLAG_HALFOPPED 0x08
+#define CHANUSERFLAG_PARTING 0x10
#define CHANUSERFLAG_OPPED_OR_VOICED (CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED)
struct ChanNode *chan;
struct UserNode *user;
- int visCount; //visible counter - if this is 0, the ChanUser gets removed
+ int visCount : 8; //visible counter - if this is 0, the ChanUser gets removed
+ int old_visCount : 8;
int chageEvents;
time_t changeTime;
decrease_viscount_butone(chan, chanuser);
chan->botcount--;
}
+ if(chanuser->flags & CHANUSERFLAG_PARTING)
+ chanuser->old_visCount--;
chanuser->visCount--;
if(chanuser->visCount == 0) {
delChanUser(chanuser, 0); //not free, yet!
event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL));
freeChanUser(chanuser);
+ } else if(!(chanuser->flags & CHANUSERFLAG_PARTING)) {
+ chanuser->flags |= CHANUSERFLAG_PARTING;
+ chanuser->old_visCount = chanuser->visCount;
+ } else if(chanuser->old_visCount == 0) {
+ int visCount = chanuser->visCount;
+ delChanUser(chanuser, 0); //not free, yet!
+ event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL));
+ freeChanUser(chanuser);
+ chanuser = addChanUser(chan, user);
+ chanuser->visCount = visCount;
+ event_join(chanuser);
}
//check if channel is still present
int chanuser_count;
char statebuf[5];
char accessbuf[50];
- char viscountbuf[5];
+ char viscountbuf[50];
int uaccess;
i = 3;
accessbufpos += sprintf(accessbuf+accessbufpos, ")");
content[2] = accessbuf;
if(flags & NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT) {
- sprintf(viscountbuf, "%d", chanuser->visCount);
+ if(chanuser->flags & CHANUSERFLAG_PARTING)
+ sprintf(viscountbuf, "%d (\003P\003 %d)", chanuser->visCount, chanuser->old_visCount);
+ else
+ sprintf(viscountbuf, "%d", chanuser->visCount);
content[3] = viscountbuf;
}
table_add(table, content);