Mercurial > hg
comparison mcabber/src/jabglue.c @ 581:ad07c868ff43
Tell the user when he or she has been kicked/banned
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Mon, 05 Dec 2005 23:54:27 +0100 |
parents | fed6d1e4d7a9 |
children | 32ae027a3238 |
comparison
equal
deleted
inserted
replaced
580:fed6d1e4d7a9 | 581:ad07c868ff43 |
---|---|
817 } | 817 } |
818 previous_state = state; | 818 previous_state = state; |
819 } | 819 } |
820 | 820 |
821 static void handle_presence_muc(const char *from, xmlnode xmldata, | 821 static void handle_presence_muc(const char *from, xmlnode xmldata, |
822 const char *jid, const char *rname, | 822 const char *roomjid, const char *rname, |
823 enum imstatus ust, char *ustmsg, char bpprio) | 823 enum imstatus ust, char *ustmsg, char bpprio) |
824 { | 824 { |
825 xmlnode y; | 825 xmlnode y; |
826 char *p; | 826 char *p; |
827 const char *m; | 827 const char *m; |
828 enum imrole mbrole = role_none; | 828 enum imrole mbrole = role_none; |
829 enum imaffiliation mbaffil = affil_none; | 829 enum imaffiliation mbaffil = affil_none; |
830 const char *mbrjid = NULL; | 830 const char *mbjid = NULL, *mbnick = NULL; |
831 const char *mbnewnick = NULL; | 831 const char *actorjid = NULL, *reason = NULL; |
832 unsigned int statuscode = 0; | |
832 GSList *room_elt; | 833 GSList *room_elt; |
833 //const char *actor = NULL, *reason = NULL; | 834 int log_muc_conf; |
834 int log_muc_conf = settings_opt_get_int("log_muc_conf"); | 835 |
835 | 836 log_muc_conf = settings_opt_get_int("log_muc_conf"); |
836 room_elt = roster_find(jid, jidsearch, 0); | 837 |
838 room_elt = roster_find(roomjid, jidsearch, 0); | |
837 if (!room_elt) { | 839 if (!room_elt) { |
838 // Add room if it doesn't already exist | 840 // Add room if it doesn't already exist |
839 room_elt = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_ROOM); | 841 room_elt = roster_add_user(roomjid, NULL, NULL, ROSTER_TYPE_ROOM); |
840 } else { | 842 } else { |
841 // Make sure this is a room (it can be a conversion user->room) | 843 // Make sure this is a room (it can be a conversion user->room) |
842 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); | 844 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM); |
843 } | 845 } |
844 | 846 |
845 // Get room member's information | 847 // Get room member's information |
846 y = xmlnode_get_tag(xmldata, "item"); | 848 y = xmlnode_get_tag(xmldata, "item"); |
847 if (y) { | 849 if (y) { |
850 xmlnode z; | |
848 p = xmlnode_get_attrib(y, "affiliation"); | 851 p = xmlnode_get_attrib(y, "affiliation"); |
849 if (p) { | 852 if (p) { |
850 if (!strcmp(p, "owner")) mbaffil = affil_owner; | 853 if (!strcmp(p, "owner")) mbaffil = affil_owner; |
851 else if (!strcmp(p, "admin")) mbaffil = affil_admin; | 854 else if (!strcmp(p, "admin")) mbaffil = affil_admin; |
852 else if (!strcmp(p, "member")) mbaffil = affil_member; | 855 else if (!strcmp(p, "member")) mbaffil = affil_member; |
862 else if (!strcmp(p, "visitor")) mbrole = role_visitor; | 865 else if (!strcmp(p, "visitor")) mbrole = role_visitor; |
863 else if (!strcmp(p, "none")) mbrole = role_none; | 866 else if (!strcmp(p, "none")) mbrole = role_none; |
864 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"", | 867 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"", |
865 from, p); | 868 from, p); |
866 } | 869 } |
867 p = xmlnode_get_attrib(y, "jid"); | 870 mbjid = xmlnode_get_attrib(y, "jid"); |
868 if (p) mbrjid = p; | 871 mbnick = xmlnode_get_attrib(y, "nick"); |
869 p = xmlnode_get_attrib(y, "nick"); | 872 // For kick/ban, there can be actor and reason tags |
870 if (p) mbnewnick = p; | 873 reason = xmlnode_get_tag_data(y, "reason"); |
871 } | 874 z = xmlnode_get_tag(y, "actor"); |
872 | 875 if (z) |
873 // Check for nickname change | 876 actorjid = xmlnode_get_attrib(z, "jid"); |
877 } | |
878 | |
879 // Get the status code | |
880 // 201: a room has been created | |
881 // 301: the user has been banned from the room | |
882 // 303: new room nickname | |
883 // 307: the user has been kicked from the room | |
884 // 321,322,332: the user has been removed from the room | |
874 y = xmlnode_get_tag(xmldata, "status"); | 885 y = xmlnode_get_tag(xmldata, "status"); |
875 if (y) { | 886 if (y) { |
876 p = xmlnode_get_attrib(y, "code"); | 887 p = xmlnode_get_attrib(y, "code"); |
877 if (p && !strcmp(p, "303") && mbnewnick) { | 888 if (p) |
878 gchar *mbuf; | 889 statuscode = atoi(p); |
879 gchar *newname_noutf8 = from_utf8(mbnewnick); | 890 } |
880 if (!newname_noutf8) | 891 |
881 scr_LogPrint(LPRINT_LOG, | 892 // Check for nickname change |
882 "Decoding of new nickname has failed: %s", | 893 if (statuscode == 303 && mbnick) { |
883 mbnewnick); | 894 gchar *mbuf; |
884 mbuf = g_strdup_printf("%s is now known as %s", rname, | 895 gchar *newname_noutf8 = from_utf8(mbnick); |
885 (newname_noutf8 ? newname_noutf8 : "(?)")); | 896 if (!newname_noutf8) |
886 scr_WriteIncomingMessage(jid, mbuf, 0, | 897 scr_LogPrint(LPRINT_LOG, "Decoding of new nickname has failed: %s", |
887 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); | 898 mbnick); |
888 if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf); | 899 mbuf = g_strdup_printf("%s is now known as %s", rname, |
889 g_free(mbuf); | 900 (newname_noutf8 ? newname_noutf8 : "(?)")); |
890 if (newname_noutf8) { | 901 scr_WriteIncomingMessage(roomjid, mbuf, 0, |
891 buddy_resource_setname(room_elt->data, rname, newname_noutf8); | 902 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
892 m = buddy_getnickname(room_elt->data); | 903 if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
893 if (m && !strcmp(rname, m)) | 904 g_free(mbuf); |
894 buddy_setnickname(room_elt->data, newname_noutf8); | 905 if (newname_noutf8) { |
895 g_free(newname_noutf8); | 906 buddy_resource_setname(room_elt->data, rname, newname_noutf8); |
896 } | 907 m = buddy_getnickname(room_elt->data); |
908 if (m && !strcmp(rname, m)) | |
909 buddy_setnickname(room_elt->data, newname_noutf8); | |
910 g_free(newname_noutf8); | |
897 } | 911 } |
898 } | 912 } |
899 | 913 |
900 // Check for departure/arrival | 914 // Check for departure/arrival |
901 if (!mbnewnick && mbrole == role_none) { | 915 if (!mbnick && mbrole == role_none) { |
902 gchar *mbuf; | 916 gchar *mbuf; |
903 | 917 |
904 // If this is a leave, check if it is ourself | 918 // If this is a leave, check if it is ourself |
905 m = buddy_getnickname(room_elt->data); | 919 m = buddy_getnickname(room_elt->data); |
906 if (m && !strcmp(rname, m)) { | 920 if (m && !strcmp(rname, m)) { |
907 // _We_ have left! (kicked, banned, etc.) | 921 // _We_ have left! (kicked, banned, etc.) |
922 gchar *mbuf; | |
923 | |
908 buddy_setnickname(room_elt->data, NULL); | 924 buddy_setnickname(room_elt->data, NULL); |
909 buddy_del_all_resources(room_elt->data); | 925 buddy_del_all_resources(room_elt->data); |
910 scr_LogPrint(LPRINT_LOGNORM, "You have left %s", jid); | 926 |
911 scr_WriteIncomingMessage(jid, "You have left", 0, | 927 if (statuscode == 307) { |
928 if (actorjid) | |
929 mbuf = g_strdup_printf("You have been kicked from %s by <%s>." | |
930 "\nReason: %s", roomjid, actorjid, reason); | |
931 else | |
932 mbuf = g_strdup_printf("You have been kicked from %s.", roomjid); | |
933 } else if (statuscode == 301) { | |
934 if (actorjid) | |
935 mbuf = g_strdup_printf("You have been banned from %s by <%s>." | |
936 "\nReason: %s", roomjid, actorjid, reason); | |
937 else | |
938 mbuf = g_strdup_printf("You have been banned from %s.", roomjid); | |
939 } else { | |
940 mbuf = g_strdup_printf("You have left %s", roomjid); | |
941 } | |
942 scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf); | |
943 scr_WriteIncomingMessage(roomjid, mbuf, 0, | |
912 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); | 944 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
945 g_free(mbuf); | |
913 update_roster = TRUE; | 946 update_roster = TRUE; |
914 | |
915 return; | 947 return; |
916 } | 948 } |
917 | 949 |
918 if (ustmsg) mbuf = g_strdup_printf("%s has left: %s", rname, ustmsg); | 950 if (ustmsg) mbuf = g_strdup_printf("%s has left: %s", rname, ustmsg); |
919 else mbuf = g_strdup_printf("%s has left", rname); | 951 else mbuf = g_strdup_printf("%s has left", rname); |
920 scr_WriteIncomingMessage(jid, mbuf, 0, | 952 scr_WriteIncomingMessage(roomjid, mbuf, 0, |
921 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); | 953 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
922 if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf); | 954 if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
923 g_free(mbuf); | 955 g_free(mbuf); |
924 } else if (buddy_getstatus(room_elt->data, rname) == offline && | 956 } else if (buddy_getstatus(room_elt->data, rname) == offline && |
925 ust != offline) { | 957 ust != offline) { |
926 gchar *mbuf; | 958 gchar *mbuf; |
927 if (buddy_getnickname(room_elt->data) == NULL) { | 959 if (buddy_getnickname(room_elt->data) == NULL) { |
928 buddy_setnickname(room_elt->data, rname); | 960 buddy_setnickname(room_elt->data, rname); |
929 mbuf = g_strdup_printf("You have joined as \"%s\"", rname); | 961 mbuf = g_strdup_printf("You have joined as \"%s\"", rname); |
930 } else { | 962 } else { |
931 mbuf = g_strdup_printf("%s has joined", rname); | 963 mbuf = g_strdup_printf("%s has joined", rname); |
932 } | 964 } |
933 scr_WriteIncomingMessage(jid, mbuf, 0, | 965 scr_WriteIncomingMessage(roomjid, mbuf, 0, |
934 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); | 966 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); |
935 if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf); | 967 if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf); |
936 g_free(mbuf); | 968 g_free(mbuf); |
937 } | 969 } |
938 | 970 |
939 // Update room member status | 971 // Update room member status |
940 if (rname) | 972 if (rname) |
941 roster_setstatus(jid, rname, bpprio, ust, ustmsg, mbrole, mbaffil, mbrjid); | 973 roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, |
974 mbrole, mbaffil, mbjid); | |
942 else | 975 else |
943 scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */ | 976 scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */ |
944 | 977 |
945 buddylist_build(); | 978 buddylist_build(); |
946 scr_DrawRoster(); | 979 scr_DrawRoster(); |