#include "IRCEvents.h"
+#include "UserNode.h"
+#include "ChanNode.h"
+#include "ChanUser.h"
int event_join(struct ChanUser *chanuser) {
return 1;
}
+int event_nick(struct UserNode *user, char *new_nick) {
+ return 1;
+}
+
int event_part(struct ChanUser *chanuser, char *reason) {
return 1;
}
return 1;
}
+int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **args, int argc) {
+ return 1;
+}
+
int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) {
return 1;
}
int event_privmsg(struct UserNode *user, struct UserNode *target, char *message) {
return 1;
}
+
+int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message) {
+ return 1;
+}
+
+int event_privnotice(struct UserNode *user, struct UserNode *target, char *message) {
+ return 1;
+}
+
+int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) {
+ return 1;
+}
+
+int event_privctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) {
+ return 1;
+}
+
+int event_invite(struct UserNode *user, struct ChanUser *target, char *channel) {
+ return 1;
+}
+
+int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) {
+ return 1;
+}
#define _IRCEvents_h
#include "main.h"
-#include "UserNode.h"
-#include "ChanNode.h"
-#include "ChanUser.h"
+
+struct UserNode;
+struct ChanNode;
+struct ChanUser;
int event_join(struct ChanUser *chanuser);
+int event_nick(struct UserNode *user, char *new_nick);
int event_part(struct ChanUser *chanuser, char *reason);
int event_quit(struct UserNode *user, char *reason);
int event_kick(struct UserNode *user, struct ChanUser *target, char *reason);
int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_topic);
+int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc);
int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message);
int event_privmsg(struct UserNode *user, struct UserNode *target, char *message);
+int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message);
+int event_privnotice(struct UserNode *user, struct UserNode *target, char *message);
+int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text);
+int event_privctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text);
+int event_invite(struct UserNode *user, struct ChanUser *target, char *channel);
+int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc);
#endif
\ No newline at end of file
delChanUser(chanuser, 0); //we need to free the chanuser manually!
event_kick(user, chanuser, argv[1]);
free(chanuser);
- if(user->flags & USERFLAG_ISTMPUSER) {
- free(user);
- }
if(target->flags & USERFLAG_ISBOT) {
//check if theres another bot in the channel - otherwise free it
checkChannelVisibility(chan);
}
event_topic(user, chan, argv[1]);
strcpy(chan->topic, argv[1]);
- if(user->flags & USERFLAG_ISTMPUSER) {
- free(user);
- }
return 1;
}
if(target)
event_privmsg(user, target, argv[1]);
}
- if(user->flags & USERFLAG_ISTMPUSER) {
- free(user);
+ return 1;
+}
+
+static IRC_CMD(raw_notice) {
+ if(from == NULL || argc < 2) return 0;
+ struct UserNode *user = getUserByMask(from);
+ if(user == NULL) {
+ user = createTempUser(from);
+ user->flags |= USERFLAG_ISTMPUSER;
+ }
+ if(argv[0][0] == '#') { //Channel notice
+ struct ChanNode *chan = getChanByName(argv[0]);
+ if(chan && chan->chanbot == client->user)
+ event_channotice(user, chan, argv[1]);
+ } else {
+ struct UserNode *target = getUserByNick(argv[0]);
+ if(target)
+ event_privnotice(user, target, argv[1]);
}
return 1;
}
+static IRC_CMD(raw_nick) {
+ if(from == NULL || argc == 0) return 0;
+ struct UserNode *user = getUserByMask(from);
+ event_nick(user, argv[0]);
+ renameUser(user, argv[0]);
+ return 1;
+}
+
static IRC_CMD(raw_ping) {
if(argc == 0) return 0;
putsock(client, "PONG :%s", argv[0]);
void parser_init() {
//all the raws we receive...
register_irc_function("001", raw_001);
+ register_irc_function("NOTICE", raw_notice);
register_irc_function("TOPIC", raw_topic);
register_irc_function("KICK", raw_kick);
- register_irc_function("JOIN", raw_join);
register_irc_function("PART", raw_part);
register_irc_function("QUIT", raw_quit);
+ register_irc_function("JOIN", raw_join);
+ register_irc_function("NICK", raw_nick);
register_irc_function("354", raw_354);
register_irc_function("315", raw_315);
register_irc_function("PING", raw_ping);
static struct UserNode **userList;
void init_UserNode() {
- userList = calloc(VALID_NICK_CHARS_FIRST_LEN, sizeof(*userList));
-
+ userList = calloc(VALID_NICK_CHARS_FIRST_LEN+1, sizeof(*userList));
}
int is_valid_nick(const char *nick) {
return NULL;
}
strcpy(user->nick, nick);
+ user->created = time(0);
user->ident[0] = 0;
user->host[0] = 0;
user->realname[0] = 0;
return NULL;
}
strcpy(user->nick, cmask);
+ user->created = time(0);
user->ident[0] = 0;
user->host[0] = 0;
user->realname[0] = 0;
return NULL;
}
strcpy(user->host, cmask);
+ user->created = time(0);
user->ident[0] = 0;
user->host[0] = 0;
user->realname[0] = 0;
else
user->next = NULL;
}
+
+void clearTempUsers() {
+ int userListIndex = TEMPUSER_LIST_INDEX;
+ struct UserNode *cuser, *last_user = NULL, *next;
+ time_t now = time(0);
+ for(cuser = userList[userListIndex]; cuser; cuser = next) {
+ next = cuser->next;
+ if(cuser->flags & USERFLAG_FREETMPUSER || now - cuser->created >= 300) {
+ if(last_user)
+ last_user->next = cuser->next;
+ else
+ userList[userListIndex] = cuser->next;
+ break;
+ } else
+ last_user = cuser;
+ }
+}
#define _UserNode_h
#include "main.h"
-#define USERFLAG_ISBOT 0x01
-#define USERFLAG_ISAUTHED 0x02
-#define USERFLAG_ISIRCOP 0x04
-#define USERFLAG_ISTMPUSER 0x08
-#define USERFLAG_ISSERVER 0x10
+#define USERFLAG_ISBOT 0x0001
+#define USERFLAG_ISAUTHED 0x0002
+#define USERFLAG_ISIRCOP 0x0004
+#define USERFLAG_ISTMPUSER 0x0008
+#define USERFLAG_ISSERVER 0x0010
+#define USERFLAG_FREETMPUSER 0x0020
+
struct ChanUser;
struct UserNode {
char host[HOSTLEN+1];
char realname[REALLEN+1];
char auth[AUTHLEN+1];
- char flags;
+ unsigned int flags;
+ time_t created;
struct ChanUser *channel;
struct UserNode *next;
init_UserNode();
init_ChanNode();
just_test_it();
+
+ time_t socket_wait;
while(1) {
- socket_loop(1);
+ socket_wait = time(0) + SOCKET_SELECT_TIME;
+ do {
+ socket_loop(SOCKET_SELECT_TIME);
+ } while(time(0) > socket_wait);
+ clearTempUsers();
}
}
return c1 - c2;
}
+#define SOCKET_SELECT_TIME 2
#define NICKLEN 30
#define USERLEN 10
#define VALID_NICK_CHARS_FIRST "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~[\\]^_`"
#define VALID_NICK_CHARS_FIRST_LEN 62
+#define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN
+
#endif
\ No newline at end of file