3 #include "ClientSocket.h"
5 struct irc_cmd *irc_commands = NULL;
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);
11 int parse_lines(struct ClientSocket *client, char *lines, int len) {
14 printf("PARSE: %s %d\n", lines, len);
15 for(i = 0; i < len; i++) {
16 if(lines[i] == '\r') //just zero it out :D
18 if(lines[i] == '\n') {
20 parse_line(client, line);
22 printf("SKIP %d: %s\n", i+1, line);
29 static void parse_line(struct ClientSocket *client, char *line) {
31 char *argv[MAXNUMPARAMS];
32 printf("[recv %lu] %s\n", (unsigned long) strlen(line), line);
42 //the rest is a single parameter
43 argv[argc++] = line + 1;
46 if (argc >= MAXNUMPARAMS)
48 while (*line != ' ' && *line)
52 parse_raw(client, argv[0], argv[1], argv+2, argc-2);
56 static void register_irc_function(char *command, irc_cmd_t *func) {
57 struct irc_cmd *irc_cmd = malloc(sizeof(*irc_cmd));
60 perror("malloc() failed");
63 irc_cmd->cmd = command;
65 irc_cmd->next = irc_commands;
66 irc_commands = irc_cmd;
69 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) {
70 struct irc_cmd *irc_cmd;
71 for(irc_cmd = irc_commands; irc_cmd; irc_cmd = irc_cmd->next) {
72 if(!stricmp(irc_cmd->cmd, cmd)) {
73 irc_cmd->func(client, from, argv, argc);
79 static IRC_CMD(raw_001) {
80 client->flags |= SOCKET_FLAG_READY;
81 putsock(client, "PRIVMSG Watchcat :hi");
85 static IRC_CMD(raw_ping) {
86 if(argc == 0) return 0;
87 putsock(client, "PONG :%s", argv[0]);
92 //all the raws we receive...
93 register_irc_function("001", raw_001);
94 register_irc_function("PING", raw_ping);