[ekg2-commit] r4225 - trunk/plugins/icq: trunk/plugins/icq/icq.c trunk/plugins/icq/icq_snac_handlers_13userlist.c
SVN commit
svn w toxygen.net
Pią, 8 Sie 2008, 00:35:52 CEST
Author: darkjames
Date: 2008-08-08 00:35:52 +0200 (Fri, 08 Aug 2008)
New Revision: 4225
Modified:
trunk/plugins/icq/icq.c
trunk/plugins/icq/icq_snac_handlers_13userlist.c
Log:
implement away-reason, for now it only works at connect,
so you can do:
/away stupid description
/connect
and users will see it...
Modified: trunk/plugins/icq/icq.c
===================================================================
--- trunk/plugins/icq/icq.c 2008-08-07 21:35:01 UTC (rev 4224)
+++ trunk/plugins/icq/icq.c 2008-08-07 22:35:52 UTC (rev 4225)
@@ -86,7 +86,32 @@
return 0;
}
+int icq_write_status_msg(session_t *s, const char *msg) {
+ string_t pkt;
+ char *dup_msg;
+ if (!s)
+ return -1;
+
+ if (s->status != EKG_STATUS_AWAY && s->status != EKG_STATUS_XA && s->status != EKG_STATUS_FFC && s->status != EKG_STATUS_DND)
+ return -1;
+ /* XXX, NA also supported */
+
+ dup_msg = xstrndup(msg, 0x1000); /* XXX, recode */
+
+ /* XXX, cookie */
+
+ /* packTLV(&packet, 0x03, 0x21, (LPBYTE)"text/x-aolrtf; charset=\"utf-8\""); */ /* XXX, 0x21? why? */
+
+ pkt = icq_pack("T", icq_pack_tlv_str(0x04, dup_msg));
+
+ icq_makesnac(s, pkt, 0x02, 0x04, 0, 0);
+ icq_send_pkt(s, pkt);
+
+ xfree(dup_msg);
+ return 0;
+}
+
int icq_write_status(session_t *s) {
uint16_t status;
string_t pkt;
@@ -336,14 +361,8 @@
protocol_connected_emit(s);
j->connecting = 0;
- if (j->aim) {
-#if MIRANDA
- char **szMsg = MirandaStatusToAwayMsg(m_iStatus);
-
- if (szMsg)
- icq_sendSetAimAwayMsgServ(*szMsg);
-#endif
- }
+ if (j->aim)
+ icq_write_status_msg(s, s->descr);
}
static uint32_t icq_get_uid(session_t *s, const char *target) {
@@ -636,6 +655,61 @@
return -1;
}
+static COMMAND(icq_command_addssi) {
+ userlist_t *u;
+ uint32_t uin;
+
+ char *nickname = NULL;
+
+ /* instead of PARAMASTARGET, 'cause that one fails with /add username in query */
+ if (get_uid(session, params[0])) {
+ /* XXX: create&use shift()? */
+ target = params[0];
+ params++;
+ }
+
+ if ((u = userlist_find(session, target))) { /* don't allow to add user again */
+ printq("user_exists_other", (params[0] ? params[0] : target), format_user(session, u->uid), session_name(session));
+ return -1;
+ }
+
+ if (!(uin = icq_get_uid(session, target))) {
+ printq("invalid_uid", target);
+ return -1;
+ }
+
+ if (params[0]) {
+ char **argv = array_make(params[0], " \t", 0, 1, 1);
+ int i;
+
+ for (i = 0; argv[i]; i++) {
+ if (match_arg(argv[i], 'g', "group", 2)) {
+ /* XXX */
+ continue;
+ }
+
+ /* if this is -n smth */
+ /* OR if param doesn't looks like command treat as a nickname */
+ if ((match_arg(argv[i], 'n', ("nickname"), 2) && argv[i + 1] && i++) || argv[i][0] != '-') {
+ if (userlist_find(session, argv[i])) {
+ printq("user_exists", argv[i], session_name(session));
+ continue;
+ }
+
+ xfree(nickname);
+ nickname = xstrdup(argv[i]);
+ continue;
+ }
+ }
+ array_free(argv);
+ }
+ /* XXX, sent packet */
+
+ xfree(nickname);
+
+ return 0;
+}
+
static COMMAND(icq_command_msg) {
uint32_t uin;
char *uid;
@@ -726,7 +800,8 @@
}
static COMMAND(icq_command_away) {
- const char *format;
+ const char *descr, *format;
+ int allow_descr = 0;
if (!xstrcmp(name, ("_autoback"))) {
format = "auto_back";
@@ -739,25 +814,31 @@
} else if (!xstrcmp(name, ("_autoaway"))) {
format = "auto_away";
session_status_set(session, EKG_STATUS_AUTOAWAY);
+ allow_descr = 1;
} else if (!xstrcmp(name, ("_autoxa"))) {
format = "auto_xa";
session_status_set(session, EKG_STATUS_AUTOXA);
+ allow_descr = 1;
} else if (!xstrcmp(name, ("away"))) {
format = "away";
session_status_set(session, EKG_STATUS_AWAY);
session_unidle(session);
+ allow_descr = 1;
} else if (!xstrcmp(name, ("dnd"))) {
format = "dnd";
session_status_set(session, EKG_STATUS_DND);
session_unidle(session);
+ allow_descr = 1;
} else if (!xstrcmp(name, ("ffc"))) {
format = "ffc";
session_status_set(session, EKG_STATUS_FFC);
session_unidle(session);
+ allow_descr = 1;
} else if (!xstrcmp(name, ("xa"))) {
format = "xa";
session_status_set(session, EKG_STATUS_XA);
session_unidle(session);
+ allow_descr = 1;
} else if (!xstrcmp(name, ("invisible"))) {
format = "invisible";
session_status_set(session, EKG_STATUS_INVISIBLE);
@@ -765,10 +846,34 @@
} else
return -1;
+ if (allow_descr) {
+ if (params[0]) {
+ session_descr_set(session, (!xstrcmp(params[0], "-")) ? NULL : params[0]);
+ reason_changed = 1;
+ } else {
+ char *tmp;
+
+ if (!config_keep_reason) {
+ session_descr_set(session, NULL);
+ } else if ((tmp = ekg_draw_descr(session_status_get(session)))) {
+ session_descr_set(session, tmp);
+ xfree(tmp);
+ }
+ }
+ } else
+ session_descr_set(session, NULL);
+
+ descr = (char *) session_descr_get(session);
+
+ if (descr) {
+ char *f = saprintf("%s_descr", format);
+ printq(f, descr, "", session_name(session));
+ xfree(f);
+ } else
+ printq(format, session_name(session));
+
ekg_update_status(session);
- printq(format, session_name(session));
-
if (session->connected)
icq_write_status(session);
return 0;
@@ -1113,14 +1218,16 @@
command_add(&icq_plugin, "icq:", "?", icq_command_inline_msg, ICQ_ONLY, NULL);
command_add(&icq_plugin, "icq:msg", "!uU !", icq_command_msg, ICQ_FLAGS_MSG, NULL);
+ command_add(&icq_plugin, "icq:addssi", "U ?", icq_command_addssi, ICQ_FLAGS, NULL);
+
command_add(&icq_plugin, "icq:auth", "!p uU", icq_command_auth, ICQ_FLAGS | COMMAND_ENABLEREQPARAMS, "-a --accept -d --deny -r --request -c --cancel");
- command_add(&icq_plugin, "icq:away", NULL, icq_command_away, ICQ_ONLY, NULL);
+ command_add(&icq_plugin, "icq:away", "r", icq_command_away, ICQ_ONLY, NULL);
command_add(&icq_plugin, "icq:back", NULL, icq_command_away, ICQ_ONLY, NULL);
- command_add(&icq_plugin, "icq:dnd", NULL, icq_command_away, ICQ_ONLY, NULL);
- command_add(&icq_plugin, "icq:ffc", NULL, icq_command_away, ICQ_ONLY, NULL);
+ command_add(&icq_plugin, "icq:dnd", "r", icq_command_away, ICQ_ONLY, NULL);
+ command_add(&icq_plugin, "icq:ffc", "r", icq_command_away, ICQ_ONLY, NULL);
command_add(&icq_plugin, "icq:invisible", NULL, icq_command_away, ICQ_ONLY, NULL);
- command_add(&icq_plugin, "icq:xa", NULL, icq_command_away, ICQ_ONLY, NULL);
+ command_add(&icq_plugin, "icq:xa", "r", icq_command_away, ICQ_ONLY, NULL);
command_add(&icq_plugin, "icq:userinfo", "!u", icq_command_userinfo, ICQ_FLAGS_TARGET, NULL);
command_add(&icq_plugin, "icq:register", NULL, icq_command_register, 0, NULL);
Modified: trunk/plugins/icq/icq_snac_handlers_13userlist.c
===================================================================
--- trunk/plugins/icq/icq_snac_handlers_13userlist.c 2008-08-07 21:35:01 UTC (rev 4224)
+++ trunk/plugins/icq/icq_snac_handlers_13userlist.c 2008-08-07 22:35:52 UTC (rev 4225)
@@ -336,16 +336,17 @@
return -3;
}
-SNAC_SUBHANDLER(SNAC_USR_09) {
- debug_error("SNAC_USR_09 XXX()\n");
- return -3;
-}
-
SNAC_SUBHANDLER(icq_snac_userlist_modifystart) {
debug_white("icq_snac_userlist_modifystart() Server is modifying contact list\n");
return 0;
}
+SNAC_SUBHANDLER(snac_userlist_modifyentry) {
+ debug_function("snac_userlist_modifyentry() Server updated our contact on list\n");
+
+ return 0;
+}
+
SNAC_SUBHANDLER(icq_snac_userlist_modifyend) {
debug_white("icq_snac_userlist_modifyend() End of server modification\n");
return 0;
@@ -378,7 +379,7 @@
case 0x01: handler = icq_snac_userlist_error; break;
case 0x03: handler = icq_snac_userlist_reply; break; /* Miranda: OK */
case 0x06: handler = icq_snac_userlist_roster; break; /* Miranda: 1/3 OK */ /* XXX, handleServerCList() */
- case 0x09: handler = SNAC_USR_09; break;
+ case 0x09: handler = snac_userlist_modifyentry; break;
case 0x0E: handler = SNAC_USR_0E; break;
case 0x0F: handler = SNAC_USR_0F; break;
case 0x11: handler = icq_snac_userlist_modifystart; break; /* Miranda: OK */
Więcej informacji o liście dyskusyjnej ekg2-commit