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();