}
strcpy(chan->name, name);
chan->user = NULL;
+ chan->chanbot = NULL;
chan->topic[0] = 0;
chan->flags = 0;
chan->next = chanList[chanListIndex];
void checkChannelVisibility(struct ChanNode* chan) {
struct ChanUser *chanuser, *next;
for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
- if(chanuser->user->flags & USERFLAG_ISBOT) return;
+ if(chanuser->user->flags & USERFLAG_ISBOT) {
+ chan->chanbot = chanuser->user;
+ return;
+ }
}
//free the channel...
for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next) {
static IRC_CMD(raw_join) {
if(from == NULL || argc < 1) return 0;
struct UserNode *user = getUserByMask(from);
+ struct ChanNode *chan = getChanByName(argv[0]);
+ if(!chan && !(user->flags & USERFLAG_ISBOT)) return 0;
if(user == NULL) {
user = addUserMask(from);
}
- struct ChanNode *chan = getChanByName(argv[0]);
if(chan == NULL) {
chan = addChannel(argv[0]);
//request member list
+ chan->chanbot = user;
struct ChanUser *chanuser = addChanUser(chan, user); //it must be a bot
get_userlist(chan, got_channel_userlist, chanuser);
} else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
delChanUser(chanuser, 0); //we need to free the chanuser manually!
event_part(chanuser, argv[1]);
free(chanuser);
- if(user->flags & USERFLAG_ISBOT) {
+ if(chan->chanbot == user) {
//check if theres another bot in the channel - otherwise free it
checkChannelVisibility(chan);
}
struct UserNode *user = getUserByMask(from);
struct ChanNode *chan = getChanByName(argv[0]);
if(chan == NULL) return 0;
+ if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates
if(user == NULL) {
user = createTempUser(from);
user->flags |= USERFLAG_ISTMPUSER;
static IRC_CMD(raw_privmsg) {
if(from == NULL || argc < 2) return 0;
struct UserNode *user = getUserByMask(from);
- struct ChanNode *chan = getChanByName(argv[0]);
- if(chan == NULL) return 0;
if(user == NULL) {
user = createTempUser(from);
user->flags |= USERFLAG_ISTMPUSER;
}
- //TEST
- struct ChanUser *chanuser;
- putsock(client, "PRIVMSG %s :[PRIVMSG] Users on this Channel:", chan->name);
- for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
- putsock(client, "PRIVMSG %s : %s!%s@%s [%s] rights: %d", chan->name, chanuser->user->nick, chanuser->user->ident, chanuser->user->host, ((chanuser->user->flags & USERFLAG_ISAUTHED) ? chanuser->user->auth : "*"), chanuser->flags);
+ if(argv[0][0] == '#') { //Channel message
+ struct ChanNode *chan = getChanByName(argv[0]);
+ if(chan && chan->chanbot == client->user)
+ event_chanmsg(user, chan, argv[1]);
+ } else {
+ struct UserNode *target = getUserByNick(argv[0]);
+ if(target)
+ event_privmsg(user, target, argv[1]);
}
- //END TEST
if(user->flags & USERFLAG_ISTMPUSER) {
free(user);
}