| 92 }; |
91 }; |
| 93 |
92 |
| 94 static void jabber_mood_cb(JabberStream *js, const char *from, xmlnode *items) { |
93 static void jabber_mood_cb(JabberStream *js, const char *from, xmlnode *items) { |
| 95 /* it doesn't make sense to have more than one item here, so let's just pick the first one */ |
94 /* it doesn't make sense to have more than one item here, so let's just pick the first one */ |
| 96 xmlnode *item = xmlnode_get_child(items, "item"); |
95 xmlnode *item = xmlnode_get_child(items, "item"); |
| 97 JabberMood newmood = UNKNOWN; |
96 char *newmood; |
| 98 char *moodtext = NULL; |
97 char *moodtext = NULL; |
| 99 JabberBuddy *buddy = jabber_buddy_find(js, from, FALSE); |
98 JabberBuddy *buddy = jabber_buddy_find(js, from, FALSE); |
| 100 xmlnode *moodinfo, *mood; |
99 xmlnode *moodinfo, *mood; |
| 101 /* ignore the mood of people not on our buddy list */ |
100 /* ignore the mood of people not on our buddy list */ |
| 102 if (!buddy || !item) |
101 if (!buddy || !item) |
| 110 if (!strcmp(moodinfo->name, "text")) { |
109 if (!strcmp(moodinfo->name, "text")) { |
| 111 if (!moodtext) /* only pick the first one */ |
110 if (!moodtext) /* only pick the first one */ |
| 112 moodtext = xmlnode_get_data(moodinfo); |
111 moodtext = xmlnode_get_data(moodinfo); |
| 113 } else { |
112 } else { |
| 114 int i; |
113 int i; |
| 115 for (i = 1; moodstrings[i]; ++i) { |
114 for (i = 0; moodstrings[i]; ++i) { |
| |
115 /* verify that the mood is known (valid) */ |
| 116 if (!strcmp(moodinfo->name, moodstrings[i])) { |
116 if (!strcmp(moodinfo->name, moodstrings[i])) { |
| 117 newmood = (JabberMood)i; |
117 newmood = moodstrings[i]; |
| 118 break; |
118 break; |
| 119 } |
119 } |
| 120 } |
120 } |
| 121 } |
121 } |
| 122 if (newmood != UNKNOWN && moodtext != NULL) |
122 if (newmood != NULL && moodtext != NULL) |
| 123 break; |
123 break; |
| 124 } |
124 } |
| 125 } |
125 } |
| 126 if (newmood != UNKNOWN) { |
126 if (newmood != NULL) { |
| 127 JabberBuddyResource *resource = jabber_buddy_find_resource(buddy, NULL); |
127 JabberBuddyResource *resource = jabber_buddy_find_resource(buddy, NULL); |
| 128 const char *status_id = jabber_buddy_state_get_status_id(resource->state); |
128 const char *status_id = jabber_buddy_state_get_status_id(resource->state); |
| 129 |
129 |
| 130 purple_prpl_got_user_status(js->gc->account, from, status_id, "mood", _(moodstrings[newmood]), "moodtext", moodtext?moodtext:"", NULL); |
130 purple_prpl_got_user_status(js->gc->account, from, status_id, "mood", _(newmood), "moodtext", moodtext?moodtext:"", NULL); |
| 131 } |
131 } |
| 132 if (moodtext) |
132 if (moodtext) |
| 133 g_free(moodtext); |
133 g_free(moodtext); |
| 134 } |
134 } |
| 135 |
135 |
| 136 void jabber_mood_init(void) { |
136 void jabber_mood_init(void) { |
| 137 jabber_add_feature("mood", "http://jabber.org/protocol/mood"); |
137 jabber_add_feature("mood", "http://jabber.org/protocol/mood"); |
| 138 jabber_pep_register_handler("moodn", "http://jabber.org/protocol/mood", jabber_mood_cb); |
138 jabber_pep_register_handler("moodn", "http://jabber.org/protocol/mood", jabber_mood_cb); |
| 139 } |
139 } |
| 140 |
140 |
| 141 void jabber_set_mood(JabberStream *js, JabberMood mood, const char *text) { |
141 void jabber_set_mood(JabberStream *js, const char *mood, const char *text) { |
| 142 xmlnode *publish, *moodnode; |
142 xmlnode *publish, *moodnode; |
| 143 if (mood == UNKNOWN) |
143 |
| 144 return; |
144 assert(mood != NULL); |
| 145 |
145 |
| 146 publish = xmlnode_new("publish"); |
146 publish = xmlnode_new("publish"); |
| 147 xmlnode_set_attrib(publish,"node","http://jabber.org/protocol/mood"); |
147 xmlnode_set_attrib(publish,"node","http://jabber.org/protocol/mood"); |
| 148 moodnode = xmlnode_new_child(xmlnode_new_child(publish, "item"), "mood"); |
148 moodnode = xmlnode_new_child(xmlnode_new_child(publish, "item"), "mood"); |
| 149 xmlnode_set_namespace(moodnode, "http://jabber.org/protocol/mood"); |
149 xmlnode_set_namespace(moodnode, "http://jabber.org/protocol/mood"); |
| 150 xmlnode_new_child(moodnode, moodstrings[mood]); |
150 xmlnode_new_child(moodnode, mood); |
| 151 |
151 |
| 152 if (text) { |
152 if (text) { |
| 153 xmlnode *textnode = xmlnode_new_child(moodnode, "text"); |
153 xmlnode *textnode = xmlnode_new_child(moodnode, "text"); |
| 154 xmlnode_insert_data(textnode, text, -1); |
154 xmlnode_insert_data(textnode, text, -1); |
| 155 } |
155 } |