From 85c3ee031dbf4afb16b1420b13d9425eee52dce2 Mon Sep 17 00:00:00 2001 From: "psyc://psyced.org/~lynX" <@> Date: Mon, 2 Mar 2009 18:57:20 +0100 Subject: [PATCH] fixed major bug in output of jabber presence state --- CHANGESTODO | 6 +++++ world/net/jabber/jabber.h | 8 +++++-- world/net/jabber/server.c | 2 +- world/net/jabber/user.c | 50 ++++++++++++++++++++++----------------- world/net/person.c | 9 +++---- world/net/server.c | 22 +++++------------ world/net/user.c | 2 +- world/net/usercmd.i | 8 ++++++- 8 files changed, 60 insertions(+), 47 deletions(-) diff --git a/CHANGESTODO b/CHANGESTODO index 6206fae..644a8bd 100644 --- a/CHANGESTODO +++ b/CHANGESTODO @@ -9,6 +9,9 @@ ________________________________________________________________________ - when a jabber clients disconnects and reconnects quickly, before the sane quit delay has operated, it will not be given other people's presence again. ++ should ignored people receive an echo for the sake of not being + distinguishable from not ignored people? yes... + ? marenz says, remote topic isn't working http://about.psyc.eu/?title=Talk:Bug_Report&curid=1506&diff=10174&oldid=10173 @@ -3916,3 +3919,6 @@ install.sh === 200902 ============================================================ archetype + when joe says "/nick joe" it is understood as removing the /nick +jabber/user +- fixed major bug in output of presence state (showFriends) + diff --git a/world/net/jabber/jabber.h b/world/net/jabber/jabber.h index e8d656d..8c5bedd 100644 --- a/world/net/jabber/jabber.h +++ b/world/net/jabber/jabber.h @@ -11,6 +11,12 @@ #define JABBER_TRANSPARENCY // switching this off improves parser // performance but kills file transfers +// local debug messages - turn them on by using psyclpc -DDjabber= +#ifdef Djabber +# undef DEBUG +# define DEBUG Djabber +#endif + #include #include #include @@ -25,8 +31,6 @@ virtual inherit JABBER_PATH "common"; #endif #define COMBINE_CHARSET XML_CHARSET -//"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 errors // eigentlich schon ein fall für textdb // siehe auch MISC/jabber/conference.fmt diff --git a/world/net/jabber/server.c b/world/net/jabber/server.c index 2674a36..9935b7a 100644 --- a/world/net/jabber/server.c +++ b/world/net/jabber/server.c @@ -444,7 +444,7 @@ open_stream(XMLNode node) { string features; string header; - P2(("jabber/server open_stream\n")) + P2(("%O open_stream from %O\n", ME, query_ip_name())) streamid = RANDHEXSTRING; unless(node["@xmlns"] == "jabber:client") { diff --git a/world/net/jabber/user.c b/world/net/jabber/user.c index fc8dcfc..b29df77 100644 --- a/world/net/jabber/user.c +++ b/world/net/jabber/user.c @@ -30,8 +30,6 @@ qResource() { return resource; } qHasCurrentPlace() { return 0; } -showFriends() {} - /* it should be posible to do some things in a way that can be shared between * user and active/gateway... mostly stuff like MUC-support, version requests * and such -- TODO @@ -129,14 +127,14 @@ msg(source, mc, data, mapping vars, showingLog) { case "_status_person_present_implied": case "_status_person_absent": case "_status_person_absent_recorded": - PT(("%O got %O\n", ME, mc)) + P2(("%O got %O\n", ME, mc)) // actually.. we never send _time_idle with this if (member(vars, "_time_idle")) { t = vars["_time_idle"]; if (stringp(t)) { t = to_int(t); - PT(("_time_idle %O == %O, right?\n", vars["_time_idle"], t)) + P2(("_time_idle %O == %O, right?\n", vars["_time_idle"], t)) } t = gmtime(time() - t); vars["_INTERNAL_time_jabber"] = JABBERTIME(t); @@ -232,6 +230,25 @@ msg(source, mc, data, mapping vars, showingLog) { return ::msg(source, mc, data, vars, showingLog); } +showFriends() { + // send presence for online friends + string template = T("_notice_presence_here_plain", + ""); + string packet = ""; + + foreach(mixed friend : m_indices(friends)) { + if (friend) + packet += psyctext(template, ([ + "_INTERNAL_target_jabber" : myjid, + "_INTERNAL_source_jabber" : mkjid(friend), + "_INTERNAL_mood_jabber" : "neutral" + ])); + } + if (strlen(packet)) emit(packet); + P2(("%O jabberish showFriends: %O outputs as %O\n", ME, friends, packet)) +} + logon() { // language support is in server.c vSet("scheme", "jabber"); @@ -250,6 +267,8 @@ logon() { myjid = NODEPREP(MYLOWERNICK) +"@" + NAMEPREP(SERVER_HOST); myjidresource = myjid +"/"+ RESOURCEPREP(resource); P2(("%O ready to rumble (%O)\n", myjidresource, ME)) + // reicht auch aufzurufen, wenn announce 0 returned.. + showFriends(); return ::logon(); } @@ -708,7 +727,7 @@ iq(XMLNode node) { ])); if (ro) packet += ro; else { - PT(("%O empty result for %O with buddy %O\n", + P2(("%O empty result for %O with buddy %O\n", ME, "_list_acquaintance_notification" + variant + "_roster", friend)) } } @@ -718,21 +737,8 @@ iq(XMLNode node) { // foreach skipped // _list_acquaintance_notification_pending // _list_acquaintance_notification_offered - packet = ""; - // send presence for online friends - // P2(("friends: %O\n", friends)) - template = T("_notice_presence_here_plain", - ""); - foreach(friend : m_values(friends)) { - if (friend) - packet += psyctext(template, ([ - "_INTERNAL_target_jabber" : myjid, - "_INTERNAL_source_jabber" : mkjid(friend), - "_INTERNAL_mood_jabber" : "neutral" - ])); - } - break; // showFriends() ? + showFriends(); + break; case "set": helper = helper["/item"]; if (helper && helper["@subscription"] == "remove") { @@ -936,7 +942,7 @@ iq(XMLNode node) { // this one is public while v("email") is more // private mvars = convert_profile(node["/vCard"], "jCard"); - PT(("%O received vCard from client (%O)\n", ME, sizeof(mvars))) + P2(("%O received vCard from client (%O)\n", ME, sizeof(mvars))) emit(""); request(ME, "_store", mvars); return; @@ -1220,7 +1226,7 @@ w(string mc, string data, mapping vars, mixed source) { // (they already closed the connection when we get here) return; case "_error_status_place_matches": - PT(("still _error_status_place_matches?\n")) + P2(("still _error_status_place_matches?\n")) return; case "_echo_request_friendship": vars["_list_groups"] = xbuddylist[vars["_nick"]] || ""; diff --git a/world/net/person.c b/world/net/person.c index 0dc3b4a..94c938d 100644 --- a/world/net/person.c +++ b/world/net/person.c @@ -2479,7 +2479,9 @@ logon(host) { #endif host = "?"; - P2(("%O person:logon %O\n", ME, IS_NEWBIE? "(newbie)": "(registered)" )) + P2(("%O person:logon %s, logged_on = %O\n", ME, + IS_NEWBIE? "(newbie)": "(registered)", + logged_on )) log_file("LOGON", "[%s] %s %s %s(%s) %s/%s/%s \"%s\"\n", ctime(), logged_on ? "O" : IS_NEWBIE ? "*" : "+", MYNICK, #ifdef _flag_log_hosts @@ -2543,9 +2545,7 @@ logon(host) { // check by raising a version counter } } -# ifdef XMPPERIMENTAL - PT(("smarticast distribution structure: %O\n", _routes)) -# endif + P3(("smarticast distribution structure in %O: %O\n", ME, _routes)) #endif #ifndef _flag_disable_module_presence switch(v("scheme")) { @@ -2780,6 +2780,7 @@ announce(level, manual, verbose, text) { text = text ? (MYNICK +" "+ text +".") : ""; // fun: "Reclaim your chat. Use PSYC. PSYC delivers."; } + // can this "optimization" cause async presence effects..? if (!changed && availability == level) return 0; if (level) vSet("availability", availability = level); else level = availability; // sending EXPIRED not permitted here diff --git a/world/net/server.c b/world/net/server.c index 56e28c4..0e2a630 100644 --- a/world/net/server.c +++ b/world/net/server.c @@ -46,8 +46,7 @@ void create() { // supercede this in inheriting server class createUser(nick) { - PT(("net/server:createUser() called in %O\n", ME)) - // this is pretty unlikely to work + P3(("%O net/server:createUser(%O)\n", ME, nick)) return named_clone(NET_PATH "user", nick); } @@ -82,7 +81,7 @@ hello(ni, elm, try, method, salt) { ni, try, elm); } -#ifdef REGISTERED_USERS_ONLY +#ifdef REGISTERED_USERS_ONLY // TODO: rename into a _flag ohYeah(whatever) { input_to(#'ohYeah, input_to_settings); // input ignore warning? inverting mc's is really a good idea! @@ -177,8 +176,8 @@ authChecked(int result, ni, try, elm) { password(try, method, salt) { mixed authCb; unless (user) { - pr("_failure_object_destructed", - "Huh? Your user object has disappeared!\n"); + w("_failure_object_destructed", // never happens + "Huh? Your user object has disappeared!"); QUIT } // nick, guesses needed? @@ -212,8 +211,8 @@ morph() { if (user) destruct(user); unless (user = createUser(nick)) { - pr("_failure_object_creation", - "Cannot create new user object.\n"); + w("_failure_object_creation", + "Cannot create new user object."); QUIT } } @@ -249,12 +248,6 @@ disconnected(remaining) { logon() { if (nick) { // authlocal support! -#if 0 - // replace former interactive of nick - user = find_person(nick) || createUser(nick); - morph(); - return 0; -#else // only auto-login the first instance of nick user = find_person(nick); unless (user) { @@ -268,18 +261,15 @@ logon() { } // otherwise prompt regularely nick = user = 0; -#endif } #ifdef LIMIT_USERS // TODO: admins MUST be able to login! - // hmm.. what does 'nick &&' do here? if (AMOUNT_SOCKETS >= LIMIT_USERS) { w("_failure_exceeded_limit_users", "Extremely sorry, but " "the maximum possible amount of people has been reached."); QUIT } #endif - // bei jabber.. input_to(): Change in CHARMODE mode requested for object 'net/jabber/server#2107' with telnet disabled. input_to(#'hello, input_to_settings); call_out(#'quit, TIME_LOGIN_IDLE); guesses = 0; diff --git a/world/net/user.c b/world/net/user.c index 7cb4bed..bd1a9a1 100644 --- a/world/net/user.c +++ b/world/net/user.c @@ -1675,7 +1675,7 @@ static showFriends(verbose) { array(mixed) k; mixed o, n, *fmt; - P3(("showFriends: %O\n", friends)) + P3(("showFriends in %O: %O\n", ME, friends)) k = m_indices(friends); unless(k && sizeof(k)) return; diff --git a/world/net/usercmd.i b/world/net/usercmd.i index fa606b6..03377cb 100644 --- a/world/net/usercmd.i +++ b/world/net/usercmd.i @@ -1557,8 +1557,14 @@ request(source, mc, vars, data) { mixed t, s; int glyph; - P2(("»»> request(%O) %O from %O in %O (%O)\n", +#if DEBUG > 3 + // in case of _store from jabber client vars may contain photo data + P4(("»»> request(%O) %O from %O in %O (%O)\n", mc, data, source, ME, vars)) +#else + P2(("»»> request(%O) %O from %O in %O\n", + mc, data, source, ME)) +#endif PSYC_TRY(mc) { // quite dubious choice of method names.. sigh case "_message_private":