comparison mcabber/src/jabglue.c @ 579:0c67755e0fa7

Introduce a handle_presence_muc() function
author Mikael Berthe <mikael@lilotux.net>
date Sun, 04 Dec 2005 23:55:47 +0100
parents b3ab662757a0
children fed6d1e4d7a9
comparison
equal deleted inserted replaced
578:b3ab662757a0 579:0c67755e0fa7
816 break; 816 break;
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,
822 const char *jid, const char *rname,
823 enum imstatus ust, char *ustmsg, char bpprio)
824 {
825 xmlnode y;
826 char *p;
827 const char *m;
828 enum imrole mbrole = role_none;
829 enum imaffiliation mbaffil = affil_none;
830 const char *mbrjid = NULL;
831 const char *mbnewnick = NULL;
832 GSList *room_elt;
833 //const char *actor = NULL, *reason = NULL;
834 int log_muc_conf = settings_opt_get_int("log_muc_conf");
835
836 room_elt = roster_find(jid, jidsearch, 0);
837 if (!room_elt) {
838 // Add room if it doesn't already exist
839 room_elt = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_ROOM);
840 } else {
841 // Make sure this is a room (it can be a conversion user->room)
842 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
843 }
844
845 // Get room member's information
846 y = xmlnode_get_tag(xmldata, "item");
847 if (y) {
848 p = xmlnode_get_attrib(y, "affiliation");
849 if (p) {
850 if (!strcmp(p, "owner")) mbaffil = affil_owner;
851 else if (!strcmp(p, "admin")) mbaffil = affil_admin;
852 else if (!strcmp(p, "member")) mbaffil = affil_member;
853 else if (!strcmp(p, "outcast")) mbaffil = affil_outcast;
854 else if (!strcmp(p, "none")) mbaffil = affil_none;
855 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown affiliation \"%s\"",
856 from, p);
857 }
858 p = xmlnode_get_attrib(y, "role");
859 if (p) {
860 if (!strcmp(p, "moderator")) mbrole = role_moderator;
861 else if (!strcmp(p, "participant")) mbrole = role_participant;
862 else if (!strcmp(p, "visitor")) mbrole = role_visitor;
863 else if (!strcmp(p, "none")) mbrole = role_none;
864 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"",
865 from, p);
866 }
867 p = xmlnode_get_attrib(y, "jid");
868 if (p) mbrjid = p;
869 p = xmlnode_get_attrib(y, "nick");
870 if (p) mbnewnick = p;
871 }
872
873 // Check for nickname change
874 y = xmlnode_get_tag(xmldata, "status");
875 if (y) {
876 p = xmlnode_get_attrib(y, "code");
877 if (p && !strcmp(p, "303") && mbnewnick) {
878 gchar *mbuf;
879 gchar *newname_noutf8 = from_utf8(mbnewnick);
880 if (!newname_noutf8)
881 scr_LogPrint(LPRINT_LOG,
882 "Decoding of new nickname has failed: %s",
883 mbnewnick);
884 mbuf = g_strdup_printf("%s is now known as %s", rname,
885 (newname_noutf8 ? newname_noutf8 : "(?)"));
886 scr_WriteIncomingMessage(jid, mbuf, 0,
887 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
888 if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf);
889 g_free(mbuf);
890 if (newname_noutf8) {
891 buddy_resource_setname(room_elt->data, rname, newname_noutf8);
892 m = buddy_getnickname(room_elt->data);
893 if (m && !strcmp(rname, m))
894 buddy_setnickname(room_elt->data, newname_noutf8);
895 g_free(newname_noutf8);
896 }
897 }
898 }
899
900 // Check for departure/arrival
901 if (!mbnewnick && mbrole == role_none) {
902 gchar *mbuf;
903
904 // If this is a leave, check if it is ourself
905 m = buddy_getnickname(room_elt->data);
906 if (m && !strcmp(rname, m)) {
907 // _We_ have left! (kicked, banned, etc.)
908 buddy_setnickname(room_elt->data, NULL);
909 buddy_del_all_resources(room_elt->data);
910 scr_LogPrint(LPRINT_LOGNORM, "You have left %s", jid);
911 scr_WriteIncomingMessage(jid, "You have left", 0,
912 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
913 update_roster = TRUE;
914
915 return;
916 }
917
918 if (ustmsg) mbuf = g_strdup_printf("%s has left: %s", rname, ustmsg);
919 else mbuf = g_strdup_printf("%s has left", rname);
920 scr_WriteIncomingMessage(jid, mbuf, 0,
921 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
922 if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf);
923 g_free(mbuf);
924 } else if (buddy_getstatus(room_elt->data, rname) == offline &&
925 ust != offline) {
926 gchar *mbuf;
927 if (buddy_getnickname(room_elt->data) == NULL) {
928 buddy_setnickname(room_elt->data, rname);
929 mbuf = g_strdup_printf("You have joined as \"%s\"", rname);
930 } else {
931 mbuf = g_strdup_printf("%s has joined", rname);
932 }
933 scr_WriteIncomingMessage(jid, mbuf, 0,
934 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
935 if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf);
936 g_free(mbuf);
937 }
938
939 // Update room member status
940 if (rname)
941 roster_setstatus(jid, rname, bpprio, ust, ustmsg, mbrole, mbaffil, mbrjid);
942 else
943 scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
944
945 buddylist_build();
946 scr_DrawRoster();
947 }
948
821 static void handle_packet_presence(jconn conn, char *type, char *from, 949 static void handle_packet_presence(jconn conn, char *type, char *from,
822 xmlnode xmldata) 950 xmlnode xmldata)
823 { 951 {
824 char *p, *r, *s; 952 char *p, *r;
825 const char *m; 953 char *ustmsg;
826 xmlnode x, y; 954 xmlnode x;
827 const char *rname; 955 const char *rname;
828 enum imstatus ust; 956 enum imstatus ust;
829 char bpprio; 957 char bpprio;
830 958
831 r = jidtodisp(from); 959 r = jidtodisp(from);
851 } 979 }
852 980
853 if (type && !strcmp(type, "unavailable")) 981 if (type && !strcmp(type, "unavailable"))
854 ust = offline; 982 ust = offline;
855 983
856 s = NULL; 984 ustmsg = NULL;
857 p = xmlnode_get_tag_data(xmldata, "status"); 985 p = xmlnode_get_tag_data(xmldata, "status");
858 if (p) { 986 if (p) {
859 s = from_utf8(p); 987 ustmsg = from_utf8(p);
860 if (!s) 988 if (!ustmsg)
861 scr_LogPrint(LPRINT_LOG, 989 scr_LogPrint(LPRINT_LOG,
862 "Decoding of status message of <%s> has failed: %s", 990 "Decoding of status message of <%s> has failed: %s",
863 from, p); 991 from, p);
864 } 992 }
865 993
873 if ((p = xmlnode_get_name(x)) && !strcmp(p, "x")) 1001 if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
874 if ((p = xmlnode_get_attrib(x, "xmlns")) && 1002 if ((p = xmlnode_get_attrib(x, "xmlns")) &&
875 !strcasecmp(p, "http://jabber.org/protocol/muc#user")) 1003 !strcasecmp(p, "http://jabber.org/protocol/muc#user"))
876 break; 1004 break;
877 } 1005 }
878 if (x) { // This is a MUC presence message 1006 if (x) {
879 enum imrole mbrole = role_none; 1007 // This is a MUC presence message
880 enum imaffiliation mbaffil = affil_none; 1008 handle_presence_muc(from, x, r, rname, ust, ustmsg, bpprio);
881 const char *mbrjid = NULL; 1009 } else {
882 const char *mbnewnick = NULL; 1010 // Not a MUC message, so this is a regular buddy...
883 GSList *room_elt; 1011 // Call hk_statuschange() if status has changed or if the
884 int log_muc_conf = settings_opt_get_int("log_muc_conf"); 1012 // status message is different
885 1013 const char *m = roster_getstatusmsg(r, rname);
886 // Add room if it doesn't already exist 1014 if ((ust != roster_getstatus(r, rname)) ||
887 room_elt = roster_find(r, jidsearch, 0); 1015 (!ustmsg && m && m[0]) || (ustmsg && (!m || strcmp(ustmsg, m))))
888 if (!room_elt) 1016 hk_statuschange(r, rname, bpprio, 0, ust, ustmsg);
889 room_elt = roster_add_user(r, NULL, NULL, ROSTER_TYPE_ROOM); 1017 }
890 else // Make sure this is a room (it can be a conversion user->room) 1018
891 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
892
893 // Get room member's information
894 y = xmlnode_get_tag(x, "item");
895 if (y) {
896 p = xmlnode_get_attrib(y, "affiliation");
897 if (p) {
898 if (!strcmp(p, "owner")) mbaffil = affil_owner;
899 else if (!strcmp(p, "admin")) mbaffil = affil_admin;
900 else if (!strcmp(p, "member")) mbaffil = affil_member;
901 else if (!strcmp(p, "outcast")) mbaffil = affil_outcast;
902 else if (!strcmp(p, "none")) mbaffil = affil_none;
903 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown affiliation \"%s\"",
904 from, p);
905 }
906 p = xmlnode_get_attrib(y, "role");
907 if (p) {
908 if (!strcmp(p, "moderator")) mbrole = role_moderator;
909 else if (!strcmp(p, "participant")) mbrole = role_participant;
910 else if (!strcmp(p, "visitor")) mbrole = role_visitor;
911 else if (!strcmp(p, "none")) mbrole = role_none;
912 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"",
913 from, p);
914 }
915 p = xmlnode_get_attrib(y, "jid");
916 if (p) mbrjid = p;
917 p = xmlnode_get_attrib(y, "nick");
918 if (p) mbnewnick = p;
919 }
920
921 // Check for nickname change
922 y = xmlnode_get_tag(x, "status");
923 if (y && mbnewnick) {
924 p = xmlnode_get_attrib(y, "code");
925 if (p && !strcmp(p, "303")) {
926 gchar *mbuf;
927 gchar *newname_noutf8 = from_utf8(mbnewnick);
928 if (!newname_noutf8)
929 scr_LogPrint(LPRINT_LOG,
930 "Decoding of new nickname has failed: %s",
931 mbnewnick);
932 mbuf = g_strdup_printf("%s is now known as %s", rname,
933 (newname_noutf8 ? newname_noutf8 : "(?)"));
934 scr_WriteIncomingMessage(r, mbuf, 0,
935 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
936 if (log_muc_conf) hlog_write_message(r, 0, FALSE, mbuf);
937 g_free(mbuf);
938 if (newname_noutf8) {
939 buddy_resource_setname(room_elt->data, rname, newname_noutf8);
940 m = buddy_getnickname(room_elt->data);
941 if (m && !strcmp(rname, m))
942 buddy_setnickname(room_elt->data, newname_noutf8);
943 g_free(newname_noutf8);
944 }
945 }
946 }
947
948 // Check for departure/arrival
949 if (!mbnewnick && mbrole == role_none) {
950 gchar *mbuf;
951
952 // If this is a leave, check if it is ourself
953 m = buddy_getnickname(room_elt->data);
954 if (m && !strcmp(rname, m)) {
955 // _We_ have left! (kicked, banned, etc.)
956 buddy_setnickname(room_elt->data, NULL);
957 buddy_del_all_resources(room_elt->data);
958 scr_LogPrint(LPRINT_LOGNORM, "You have left %s", r);
959 scr_WriteIncomingMessage(r, "You have left", 0,
960 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
961 update_roster = TRUE;
962
963 goto out_packet_presence;
964 }
965
966 if (s) mbuf = g_strdup_printf("%s has left: %s", rname, s);
967 else mbuf = g_strdup_printf("%s has left", rname);
968 scr_WriteIncomingMessage(r, mbuf, 0,
969 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
970 if (log_muc_conf) hlog_write_message(r, 0, FALSE, mbuf);
971 g_free(mbuf);
972 } else if (buddy_getstatus(room_elt->data, rname) == offline &&
973 ust != offline) {
974 gchar *mbuf;
975 if (buddy_getnickname(room_elt->data) == NULL) {
976 buddy_setnickname(room_elt->data, rname);
977 mbuf = g_strdup_printf("You have joined as \"%s\"", rname);
978 } else {
979 mbuf = g_strdup_printf("%s has joined", rname);
980 }
981 scr_WriteIncomingMessage(r, mbuf, 0,
982 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
983 if (log_muc_conf) hlog_write_message(r, 0, FALSE, mbuf);
984 g_free(mbuf);
985 }
986
987 // Update room member status
988 if (rname)
989 roster_setstatus(r, rname, bpprio, ust, s, mbrole, mbaffil, mbrjid);
990 else
991 scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
992
993 buddylist_build();
994 scr_DrawRoster();
995
996 goto out_packet_presence;
997 }
998
999 // Not a MUC message, so this is a regular buddy...
1000 // Call hk_statuschange() if status has changed or if the
1001 // status message is different
1002 m = roster_getstatusmsg(r, rname);
1003 if ((ust != roster_getstatus(r, rname)) ||
1004 (!s && m && m[0]) || (s && (!m || strcmp(s, m))))
1005 hk_statuschange(r, rname, bpprio, 0, ust, s);
1006
1007 out_packet_presence:
1008 g_free(r); 1019 g_free(r);
1009 if (s) g_free(s); 1020 if (ustmsg) g_free(ustmsg);
1010 } 1021 }
1011 1022
1012 static void handle_packet_message(jconn conn, char *type, char *from, 1023 static void handle_packet_message(jconn conn, char *type, char *from,
1013 xmlnode xmldata) 1024 xmlnode xmldata)
1014 { 1025 {