Mercurial > ~mikael > mcabber > hg
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 { |