diff options
Diffstat (limited to 'src/irc.c')
-rw-r--r-- | src/irc.c | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/src/irc.c b/src/irc.c new file mode 100644 index 00000000..7d87d38f --- /dev/null +++ b/src/irc.c @@ -0,0 +1,297 @@ +/* File: irc.c */ + +/* Purpose: irc chat */ + +/* + * Copyright (c) 2001 DarkGod, Andrew Sidwell + * + * This software may be copied and distributed for educational, research, and + * not for profit purposes provided that this copyright and statement are + * included in all such copies. + */ + +#include "angband.h" + +#define IRC_SERVER "irc.worldirc.org" +#define IRC_PORT "6667" +#define IRC_CHANNEL "#tome" + +/* + * By the way, CTCP's for unique kills and artefact finds would be nice to + * have, for example: + * + * *pelpel finds Long Sword 'Ringil' (4d5) (+22,+25) (+10 to speed) :) + */ + +ip_connection tome_irc_forge; +ip_connection *tome_irc = &tome_irc_forge; +bool irc_can_join = FALSE; +char irc_nick[30]; +char irc_world[100]; + +void irc_connect() +{ + char buf[500], *s; + int rnd_name = randint(999); + + if (tome_irc->connected) return; + + sprintf(irc_world, "%99s", IRC_CHANNEL); + sprintf(irc_nick, "Dummy_%03d", rnd_name); + get_string("Enter Nickname: ", irc_nick, 10); + + zsock.setup(tome_irc, IRC_SERVER, atoi(IRC_PORT), ZSOCK_TYPE_TCP, FALSE); + zsock.open(tome_irc); + zsock.write_simple(tome_irc, format("NICK %s\r\n", irc_nick)); + zsock.wait(tome_irc, 40); + zsock.read_simple(tome_irc, buf, 500); + s = strchr(buf, ':'); + zsock.write_simple(tome_irc, format("PONG %s\r\n", s)); + zsock.write_simple(tome_irc, format("USER tome 0 *BIRC :%s %d.%d.%d User\r\n", + game_module, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH)); +#if 0 /* Pfft spoilsport */ + while (!irc_can_join) + irc_poll(); +#endif + + zsock.write_simple(tome_irc, format("JOIN %s\r\n", irc_world)); + + cmsg_print(TERM_L_GREEN, "Connected to IRC"); + + zsock.add_timer(irc_poll); +} + +void irc_change_nick() +{ + return; +} + +void irc_disconnect() +{ + if (!tome_irc->connected) return; + irc_can_join = FALSE; + + irc_quit(format("%s %d.%d.%d", game_module, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH)); + + cmsg_print(TERM_L_RED, "Disconnected from IRC"); +} + +void irc_disconnect_aux(char *str, bool message) +{ + if (!tome_irc->connected) return; + irc_can_join = FALSE; + + irc_quit(str); + + if (message) cmsg_print(TERM_L_RED, "Disconnected from IRC"); +} + +void irc_emote(char *buf) +{ + char *b; + char *base = "PRIVMSG %s :%cACTION %s%c\r\n"; + + if (!tome_irc->connected) return; + + C_MAKE(b, strlen(buf) + strlen(base) + 1, char); + sprintf(b, base, irc_world, 1, buf, 1); + zsock.write_simple(tome_irc, b); + sprintf(b, "* %s %s", irc_nick, buf); + message_add(MESSAGE_IRC, b, TERM_YELLOW); + C_FREE(b, strlen(buf) + strlen(base) + 1, char); + fix_irc_message(); +} + +void irc_chat() +{ + char buf[80] = ""; + + if (!tome_irc->connected) return; + if (get_string("Say: ", buf, 80)) + { + if (prefix(buf, "/me ")) + { + irc_emote(buf + 4); + } + else if ((prefix(buf, "/join ")) && (buf[6] != '\0')) + { + zsock.write_simple(tome_irc, format("PART %s\r\n", irc_world)); + sprintf(irc_world, "%99s", buf + 6); + zsock.write_simple(tome_irc, format("JOIN %s\r\n", irc_world)); + } + else + { + zsock.write_simple(tome_irc, format("PRIVMSG %s :%s\r\n", irc_world, buf /*, 3, irc_world */)); + message_add(MESSAGE_IRC, format("<%s> #w%s", irc_nick, buf), TERM_L_BLUE); + fix_irc_message(); + } + } +} + +#define TERM_CTCP TERM_L_GREEN +#define TERM_SERVER TERM_L_BLUE +#define TERM_CHAT1 TERM_YELLOW +#define TERM_CHAT2 TERM_WHITE + +void irc_poll() +{ + char buf[5000], *next, *nick, *space; + + if (tome_irc->connected && zsock.can_read(tome_irc)) + { + zsock.read_simple(tome_irc, buf, 2500); + + if (prefix(buf, "PING ")) + { + message_add(MESSAGE_IRC, format("*** Recieved a PING request from server %s.", buf + 6), TERM_SERVER); + zsock.write_simple(tome_irc, format("PONG %s\r\n", buf + 5)); + return; + } + if (*buf != ':') return; + nick = buf + 1; + + space = strchr(nick, ' '); + if (space) + { + if (prefix(space + 1, "376")) + irc_can_join = TRUE; + } + + if (prefix(nick, "_")) + { + nick = buf + 6; + } + + next = strchr(nick, '!'); + if (next == NULL) return; + *next = '\0'; + next++; + next = strchr(next, ' '); + if (next == NULL) return; + next++; + if (prefix(next, "PRIVMSG")) + { + next = strchr(next, ':'); + if (next == NULL) return; + *next = '\0'; + next++; + if (*next == 1) + { + next++; + if (prefix(next, "ACTION")) + { + u32b i = 0, j = 0, max = (79 - strlen(nick) - 3); + bool nicked = FALSE; + char tmp[90]; + + next += 7; + if (strlen(next)) next[strlen(next) - 1] = '\0'; + + while (next[i]) + { + tmp[j++] = next[i++]; + if (j > max) + { + tmp[j] = '\0'; + if (nicked) + message_add(MESSAGE_IRC, format("%s", tmp), TERM_CHAT1); + else + message_add(MESSAGE_IRC, format("* %s %s", nick, tmp), TERM_CHAT1); + nicked = TRUE; + j = 0; + } + } + if (j > 0) + { + tmp[j] = '\0'; + if (nicked) + message_add(MESSAGE_IRC, format("%s", tmp), TERM_CHAT1); + else + message_add(MESSAGE_IRC, format("* %s %s", nick, tmp), TERM_CHAT1); + } + + fix_irc_message(); + } + else if (prefix(next, "PING")) + { + message_add(MESSAGE_IRC, format("*** PING request from %s", nick), TERM_CTCP); + fix_irc_message(); + + zsock.write_simple(tome_irc, format("NOTICE %s :%cPING %d%c\r\n", nick, 1, next, 1)); + } + else if (prefix(next, "NICK")) + { + message_add(MESSAGE_IRC, format("*** NICK request from %s", nick), TERM_CTCP); + fix_irc_message(); + + zsock.write_simple(tome_irc, format("NOTICE %s :%cNICK %s%c\r\n", nick, 1, irc_nick, 1)); + } + else if (prefix(next, "VERSION")) + { + message_add(MESSAGE_IRC, format("*** VERSION request from %s", nick), TERM_CTCP); + fix_irc_message(); + + zsock.write_simple(tome_irc, format("NOTICE %s :%cVERSION %s %d.%d.%d%c\r\n", nick, 1, game_module, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, 1)); + } + } + else + { + u32b i = 0, j = 0, max = (79 - strlen(nick) - 3); + bool nicked = FALSE; + char tmp[90]; + + while (next[i]) + { + tmp[j++] = next[i++]; + if (j > max) + { + tmp[j] = '\0'; + if (nicked) + message_add(MESSAGE_IRC, format("#w%s", tmp), TERM_CHAT1); + else + message_add(MESSAGE_IRC, format("#y<%s> #w%s", nick, tmp), TERM_CHAT1); + nicked = TRUE; + j = 0; + } + } + if (j > 0) + { + tmp[j] = '\0'; + if (nicked) + message_add(MESSAGE_IRC, format("#w%s", tmp), TERM_CHAT1); + else + message_add(MESSAGE_IRC, format("#y<%s> #w%s", nick, tmp), TERM_CHAT1); + } + fix_irc_message(); + } + } + if (prefix(next, "JOIN")) + { + message_add(MESSAGE_IRC, format("%s has entered the Chatroom", nick), TERM_YELLOW); + fix_irc_message(); + } + if (prefix(next, "QUIT")) + { + next = strchr(next, ':'); + if (next == NULL) return; + *next = '\0'; + next++; + message_add(MESSAGE_IRC, format("%s has quit the Chatroom (%s)", nick, next), TERM_YELLOW); + fix_irc_message(); + } + } +} + + +void irc_quit(char *str) +{ + char buf[300]; + + zsock.remove_timer(irc_poll); + + sprintf(buf, "QUIT :%s\r\n", str); + + zsock.write_simple(tome_irc, buf); + zsock.close(tome_irc); + zsock.unsetup(tome_irc); +} |