fixed debug output :D
[NeonServV5.git] / IRCParser.c
1
2 #include "IRCParser.h"
3 #include "ClientSocket.h"
4
5 struct irc_cmd *irc_commands = NULL;
6
7 static void parse_line(struct ClientSocket *client, char *line);
8 static void register_irc_function(char *command, irc_cmd_t *func);
9 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc);
10
11 int parse_lines(struct ClientSocket *client, char *lines, int len) {
12     int i, startpos = 0;
13     printf("PARSE: %s %d\n", lines, len);
14     for(i = 0; i < len; i++) {
15         if(lines[i] == '\r') //just zero it out :D
16             lines[i] = 0;
17         if(lines[i] == '\n') {
18             lines[i] = 0;
19             parse_line(client, lines);
20             lines += strlen(lines)+1;
21             printf("SKIP %lu: %s\n", (unsigned long) strlen(lines)+1, lines);
22             startpos = i+1;
23         }
24     }
25     return startpos;
26 }
27
28 static void parse_line(struct ClientSocket *client, char *line) {
29     int i = 0, argc = 0;
30     char *argv[MAXNUMPARAMS];
31     printf("[recv %lu] %s\n", (unsigned long) strlen(line), line);
32     if(line[0] == ':')
33         i = 1;
34     else
35         argv[argc++] = NULL;
36     while(*line) {
37         //skip leading spaces
38         while (*line == ' ')
39             *line++ = 0;
40         if (*line == ':') {
41            //the rest is a single parameter
42            argv[argc++] = line + 1;
43         }
44         argv[argc++] = line;
45         if (argc >= MAXNUMPARAMS)
46             break;
47         while (*line != ' ' && *line)
48             line++;
49     }
50     if(argc >= 2) {
51         parse_raw(client, argv[0], argv[1], argv+2, argc-2);
52     }
53 }
54
55 static void register_irc_function(char *command, irc_cmd_t *func) {
56     struct irc_cmd *irc_cmd = malloc(sizeof(*irc_cmd));
57     if (!irc_cmd)
58     {
59         perror("malloc() failed");
60         return;
61     }
62     irc_cmd->cmd = command;
63     irc_cmd->func = func;
64     irc_cmd->next = irc_commands;
65     irc_commands = irc_cmd;
66 }
67
68 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) {
69     struct irc_cmd *irc_cmd;
70     for(irc_cmd = irc_commands; irc_cmd; irc_cmd = irc_cmd->next) {
71         if(!stricmp(irc_cmd->cmd, cmd)) {
72             irc_cmd->func(client, from, argv, argc);
73             break;
74         }
75     }
76 }
77
78 static IRC_CMD(raw_001) {
79     client->flags |= SOCKET_FLAG_READY;
80     putsock(client, "PRIVMSG Watchcat :hi");
81     return 1;
82 }
83
84 static IRC_CMD(raw_ping) {
85     if(argc == 0) return 0;
86     putsock(client, "PONG :%s", argv[0]);
87     return 1;
88 }
89
90 void parser_init() {
91     //all the raws we receive...
92     register_irc_function("001", raw_001);
93     register_irc_function("PING", raw_ping);
94 }