Mercurial > pidgin
comparison src/protocols/irc/irc.c @ 2339:9bda60d2d2e6
[gaim-migrate @ 2352]
removing some duplicate code and handling CTCP VERSION ;)
committer: Tailor Script <tailor@pidgin.im>
| author | Eric Warmenhoven <eric@warmenhoven.org> |
|---|---|
| date | Fri, 21 Sep 2001 08:59:42 +0000 |
| parents | 1ea2792b6004 |
| children | 569ae9f2bb89 |
comparison
equal
deleted
inserted
replaced
| 2338:2bf8a8131479 | 2339:9bda60d2d2e6 |
|---|---|
| 645 } | 645 } |
| 646 bcs = bcs->next; | 646 bcs = bcs->next; |
| 647 } | 647 } |
| 648 } | 648 } |
| 649 | 649 |
| 650 static void handle_privmsg(struct gaim_connection *gc, char *to, char *nick, char *msg) | |
| 651 { | |
| 652 if (is_channel(gc, to)) { | |
| 653 struct conversation *c = irc_find_chat(gc, to); | |
| 654 if (!c) | |
| 655 return; | |
| 656 irc_got_chat_in(gc, c->id, nick, 0, msg, time(NULL)); | |
| 657 } else { | |
| 658 char *tmp = g_malloc(strlen(nick) + 2); | |
| 659 g_snprintf(tmp, strlen(nick) + 2, "@%s", nick); | |
| 660 if (find_conversation(tmp)) | |
| 661 irc_got_im(gc, tmp, msg, 0, time(NULL)); | |
| 662 else { | |
| 663 *tmp = '+'; | |
| 664 if (find_conversation(tmp)) | |
| 665 irc_got_im(gc, tmp, msg, 0, time(NULL)); | |
| 666 else | |
| 667 irc_got_im(gc, nick, msg, 0, time(NULL)); | |
| 668 } | |
| 669 g_free(tmp); | |
| 670 } | |
| 671 } | |
| 672 | |
| 673 static void handle_ctcp(struct gaim_connection *gc, char *to, char *nick, | |
| 674 char *msg, char *word[], char *word_eol[]) | |
| 675 { | |
| 676 struct irc_data *id = gc->proto_data; | |
| 677 char buf[IRC_BUF_LEN]; | |
| 678 | |
| 679 if (!g_strncasecmp(msg, "VERSION", 7)) { | |
| 680 g_snprintf(buf, sizeof(buf), "NOTICE %s :\001VERSION GAIM " VERSION ": The Pimpin " | |
| 681 "Penguin AIM Clone: " WEBSITE "\001\r\n", nick); | |
| 682 irc_write(id->fd, buf, strlen(buf)); | |
| 683 } | |
| 684 if (!g_strncasecmp(msg, "ACTION", 6)) { | |
| 685 char *po = strchr(msg + 6, 1); | |
| 686 char *tmp; | |
| 687 if (po) *po = 0; | |
| 688 tmp = g_strconcat("/me", msg + 6, NULL); | |
| 689 handle_privmsg(gc, to, nick, tmp); | |
| 690 g_free(tmp); | |
| 691 } | |
| 692 /* XXX should probably write_to_conv or something here */ | |
| 693 } | |
| 694 | |
| 650 static void irc_callback(gpointer data, gint source, GaimInputCondition condition) | 695 static void irc_callback(gpointer data, gint source, GaimInputCondition condition) |
| 651 { | 696 { |
| 652 struct gaim_connection *gc = data; | 697 struct gaim_connection *gc = data; |
| 653 struct irc_data *idata = gc->proto_data; | 698 struct irc_data *idata = gc->proto_data; |
| 654 int i = 0; | 699 int i = 0; |
| 795 if (!*word[3]) | 840 if (!*word[3]) |
| 796 return; | 841 return; |
| 797 to = word[3]; | 842 to = word[3]; |
| 798 msg = *word_eol[4] == ':' ? word_eol[4] + 1 : word_eol[4]; | 843 msg = *word_eol[4] == ':' ? word_eol[4] + 1 : word_eol[4]; |
| 799 if (msg[0] == 1 && msg[strlen (msg) - 1] == 1) { /* ctcp */ | 844 if (msg[0] == 1 && msg[strlen (msg) - 1] == 1) { /* ctcp */ |
| 800 if (!g_strncasecmp(msg + 1, "ACTION", 6)) { | 845 if (!g_strncasecmp(msg + 1, "DCC ", 4)) |
| 801 char *po = strchr(msg + 7, 1); | 846 process_data_init(pdibuf, buf, word, word_eol, TRUE); |
| 802 char *tmp; | 847 handle_ctcp(gc, to, nick, msg + 1, word, word_eol); |
| 803 if (po) *po = 0; | |
| 804 if (is_channel(gc, to)) { | |
| 805 struct conversation *c = irc_find_chat(gc, to); | |
| 806 if (!c) | |
| 807 return; | |
| 808 tmp = g_strconcat("/me", msg + 7, NULL); | |
| 809 irc_got_chat_in(gc, c->id, nick, 0, tmp, time(NULL)); | |
| 810 g_free(tmp); | |
| 811 } else { | |
| 812 tmp = g_strconcat("/me", msg + 7, NULL); | |
| 813 to = g_malloc(strlen(nick) + 2); | |
| 814 g_snprintf(to, strlen(nick) + 2, "@%s", nick); | |
| 815 if (find_conversation(to)) | |
| 816 irc_got_im(gc, to, tmp, 0, time(NULL)); | |
| 817 else { | |
| 818 *to = '+'; | |
| 819 if (find_conversation(to)) | |
| 820 irc_got_im(gc, to, tmp, 0, time(NULL)); | |
| 821 else | |
| 822 irc_got_im(gc, nick, tmp, 0, time(NULL)); | |
| 823 } | |
| 824 g_free(to); | |
| 825 g_free(tmp); | |
| 826 } | |
| 827 } | |
| 828 } else { | 848 } else { |
| 829 if (is_channel(gc, to)) { | 849 handle_privmsg(gc, to, nick, msg); |
| 830 struct conversation *c = irc_find_chat(gc, to); | |
| 831 if (!c) | |
| 832 return; | |
| 833 irc_got_chat_in(gc, c->id, nick, 0, msg, time(NULL)); | |
| 834 } else { | |
| 835 to = g_malloc(strlen(nick) + 2); | |
| 836 g_snprintf(to, strlen(nick) + 2, "@%s", nick); | |
| 837 if (find_conversation(to)) | |
| 838 irc_got_im(gc, to, msg, 0, time(NULL)); | |
| 839 else { | |
| 840 *to = '+'; | |
| 841 if (find_conversation(to)) | |
| 842 irc_got_im(gc, to, msg, 0, time(NULL)); | |
| 843 else | |
| 844 irc_got_im(gc, nick, msg, 0, time(NULL)); | |
| 845 } | |
| 846 g_free(to); | |
| 847 } | |
| 848 } | 850 } |
| 849 } else if (!strcmp(cmd, "PONG")) { /* */ | 851 } else if (!strcmp(cmd, "PONG")) { /* */ |
| 850 } else if (!strcmp(cmd, "QUIT")) { | 852 } else if (!strcmp(cmd, "QUIT")) { |
| 851 irc_rem_chat_bud(gc, nick); | 853 irc_rem_chat_bud(gc, nick); |
| 852 } else if (!strcmp(cmd, "TOPIC")) { | 854 } else if (!strcmp(cmd, "TOPIC")) { |
