mirror of
https://github.com/ChronosX88/psyced.git
synced 2024-11-08 19:41:00 +00:00
linkCleanUp()
This commit is contained in:
parent
18aa0276d1
commit
836709492f
@ -1779,6 +1779,10 @@ see also: http://about.psyc.eu/SPAM
|
|||||||
evtl nicht alle im richtigen channel, um den enter zu sehen..)
|
evtl nicht alle im richtigen channel, um den enter zu sehen..)
|
||||||
|
|
||||||
== IRC ISSUES 1.0 ======================================================
|
== IRC ISSUES 1.0 ======================================================
|
||||||
|
- according to rfc and ircd source IRC parser should accept when the last
|
||||||
|
argument is just a word instead of a phrase prefixed by :
|
||||||
|
this is unusual, but legal: "PRIVMSG #blah hello"
|
||||||
|
|
||||||
+ some irc clients do not implement their own pinging, and some NATs really
|
+ some irc clients do not implement their own pinging, and some NATs really
|
||||||
kill your irc session if it is too quiet too long. we need optional server
|
kill your irc session if it is too quiet too long. we need optional server
|
||||||
side pings
|
side pings
|
||||||
|
@ -44,6 +44,11 @@ parse(a) {
|
|||||||
if (a == "") return; // don't let " \n" execute "/s"
|
if (a == "") return; // don't let " \n" execute "/s"
|
||||||
unless (sscanf(a, ":%s %s", from, t)) t = a;
|
unless (sscanf(a, ":%s %s", from, t)) t = a;
|
||||||
sscanf(t, "%s :%s", t, text);
|
sscanf(t, "%s :%s", t, text);
|
||||||
|
// when 'text' is not present, the last argument could be a single
|
||||||
|
// word text according to rfc. this has never seemed to hurt, but
|
||||||
|
// we are not exactly compliant in that sense. we could copy the
|
||||||
|
// last arg over into text, but that requires to change the api
|
||||||
|
// into explode()-based. WONTFIX
|
||||||
unless (sscanf(t, "%s %s", cmd, args)) cmd = t;
|
unless (sscanf(t, "%s %s", cmd, args)) cmd = t;
|
||||||
if (cmd) ircMsg(from, lower_case(cmd), args, text, a);
|
if (cmd) ircMsg(from, lower_case(cmd), args, text, a);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -476,10 +476,15 @@ qLocation(string service) {
|
|||||||
return v("locations")[service];
|
return v("locations")[service];
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns 0 if that was just an update
|
// returns 0 if that was just an update. 1 on success.
|
||||||
// 1 on success
|
// this was originally used by sip/udp only, then slowly
|
||||||
|
// integrated into existing code
|
||||||
sLocation(string service, mixed data) {
|
sLocation(string service, mixed data) {
|
||||||
ASSERT("sLocation", v("locations"), v("locations"))
|
ASSERT("sLocation", v("locations"), v("locations"))
|
||||||
|
// should this function also call register_location ?
|
||||||
|
// yes because a delivery error should remove clients
|
||||||
|
// from the location table, too.. not just proper
|
||||||
|
// unlink requests FIXME
|
||||||
if (v("locations")[service] == data) return 0;
|
if (v("locations")[service] == data) return 0;
|
||||||
unless (data) {
|
unless (data) {
|
||||||
string retval = v("locations")[service];
|
string retval = v("locations")[service];
|
||||||
@ -526,7 +531,8 @@ static linkSet(service, location, source) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef NEW_UNLINK
|
#ifdef NEW_UNLINK
|
||||||
static linkDel(service, source) {
|
static linkDel(service, source, variant) {
|
||||||
|
string mc = "_notice_unlink";
|
||||||
string candidate = v("locations")[service];
|
string candidate = v("locations")[service];
|
||||||
unless (candidate) {
|
unless (candidate) {
|
||||||
P3(("linkDel(%O, %O) called in %O: no such candidate!\n",
|
P3(("linkDel(%O, %O) called in %O: no such candidate!\n",
|
||||||
@ -536,19 +542,42 @@ static linkDel(service, source) {
|
|||||||
P1(("linkDel(%O, %O) called in %O: unlinking %O.\n",
|
P1(("linkDel(%O, %O) called in %O: unlinking %O.\n",
|
||||||
service, source, ME, candidate));
|
service, source, ME, candidate));
|
||||||
unless (source) source = candidate;
|
unless (source) source = candidate;
|
||||||
|
// sLocation?
|
||||||
register_location(candidate, 0);
|
register_location(candidate, 0);
|
||||||
|
// maybe actual deletion would need to be delayed after
|
||||||
|
// letting locations know. they might still be sending
|
||||||
|
// stuff to us, right?
|
||||||
m_delete(v("locations"), service || 0);
|
m_delete(v("locations"), service || 0);
|
||||||
if (service) sendmsg(source, "_notice_unlink_service", 0,
|
if (variant) mc += variant;
|
||||||
|
if (service) sendmsg(source, mc, 0,
|
||||||
([ "_service" : service,
|
([ "_service" : service,
|
||||||
"_location_service" : candidate,
|
"_location_service" : candidate,
|
||||||
"_identification" : v("_source") ]));
|
"_identification" : v("_source") ]));
|
||||||
else sendmsg(source, "_notice_unlink", 0,
|
else sendmsg(source, mc, 0,
|
||||||
([ "_location" : candidate,
|
([ "_location" : candidate,
|
||||||
"_identification" : v("_source") ]));
|
"_identification" : v("_source") ]));
|
||||||
return candidate;
|
return candidate;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static linkCleanUp(variant) {
|
||||||
|
mixed type, loc;
|
||||||
|
|
||||||
|
foreach (type, loc : v("locations")) {
|
||||||
|
P2(("linkCleanUp(%O) to %O's ex-%O-client %O\n",
|
||||||
|
variant, ME, type, loc))
|
||||||
|
#ifdef NEW_UNLINK
|
||||||
|
linkDel(type, 0, variant);
|
||||||
|
#else
|
||||||
|
// no clue if the UNL is still out there..
|
||||||
|
// lets send a ping so it can reconnect
|
||||||
|
// but first we have to delete it from our structures!
|
||||||
|
m_delete(v("locations"), 0);
|
||||||
|
sendmsg(loc, "_status_unlinked", 0, ([]));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// extend sName() from name.c
|
// extend sName() from name.c
|
||||||
sName2(a) {
|
sName2(a) {
|
||||||
int e;
|
int e;
|
||||||
@ -615,7 +644,9 @@ sName2(a) {
|
|||||||
availability = v("availability");
|
availability = v("availability");
|
||||||
#endif // _flag_disable_module_presence
|
#endif // _flag_disable_module_presence
|
||||||
|
|
||||||
unless (v("locations")) vSet("locations", ([ ]));
|
if (v("locations")) linkCleanUp("_crash");
|
||||||
|
else vSet("locations", ([ ]));
|
||||||
|
|
||||||
// protection against file read errors
|
// protection against file read errors
|
||||||
if (IS_NEWBIE) {
|
if (IS_NEWBIE) {
|
||||||
if (boss(a)) {
|
if (boss(a)) {
|
||||||
@ -630,7 +661,7 @@ sName2(a) {
|
|||||||
destruct(ME);
|
destruct(ME);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifndef RELAY
|
#ifdef _flag_enable_administrator_by_nick
|
||||||
else if (strstr(lower_case(a), "admin") != -1) {
|
else if (strstr(lower_case(a), "admin") != -1) {
|
||||||
this_player()->w("_failure_object_create_admin",
|
this_player()->w("_failure_object_create_admin",
|
||||||
"This nickname is available to administrators only.");
|
"This nickname is available to administrators only.");
|
||||||
@ -647,20 +678,6 @@ sName2(a) {
|
|||||||
|
|
||||||
// maybe use v("identification") here?
|
// maybe use v("identification") here?
|
||||||
vSet("_source", psyc_name(ME));
|
vSet("_source", psyc_name(ME));
|
||||||
|
|
||||||
// TODO: needs to be foreached for all types of locations?
|
|
||||||
if (e = v("locations")[0]) {
|
|
||||||
#ifdef NEW_UNLINK
|
|
||||||
linkDel(0);
|
|
||||||
#else
|
|
||||||
P2(("sending _status_unlinked to ex-client %O\n", e))
|
|
||||||
// no clue if the UNL is still out there..
|
|
||||||
// lets send a ping so it can reconnect
|
|
||||||
// but first we have to delete it from our structures!
|
|
||||||
m_delete(v("locations"), 0);
|
|
||||||
sendmsg(e, "_status_unlinked", 0, ([]));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return MYNICK; // means new name accepted
|
return MYNICK; // means new name accepted
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2640,9 +2657,12 @@ quit(immediate, variant) {
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
P3(("person:QUIT(%O,%O) in %O\n", immediate,variant, ME))
|
P3(("person:QUIT(%O,%O) in %O\n", immediate,variant, ME))
|
||||||
#ifdef NEW_UNLINK
|
// keeping services running while logging out should be possible.. but
|
||||||
linkDel(0);
|
//linkDel(0);
|
||||||
#endif
|
if (v("locations")) {
|
||||||
|
linkCleanUp();
|
||||||
|
vDel("locations");
|
||||||
|
}
|
||||||
if (immediate == 1 || (immediate && find_call_out(#'quit) != -1)) {
|
if (immediate == 1 || (immediate && find_call_out(#'quit) != -1)) {
|
||||||
rc = save();
|
rc = save();
|
||||||
if (sizeof(places)) {
|
if (sizeof(places)) {
|
||||||
|
@ -10,7 +10,7 @@ qHasCurrentPlace() { return 0; }
|
|||||||
|
|
||||||
logon() {
|
logon() {
|
||||||
#ifdef NO_EXTERNAL_LOGINS
|
#ifdef NO_EXTERNAL_LOGINS
|
||||||
return destruct(ME);
|
return destruct(ME);
|
||||||
#endif
|
#endif
|
||||||
// psyc users dont have their own socket, so the driver
|
// psyc users dont have their own socket, so the driver
|
||||||
// does not call disconnected() for them - this enables the
|
// does not call disconnected() for them - this enables the
|
||||||
|
@ -896,19 +896,27 @@ case "_status_presence":
|
|||||||
case "_notice_person_absent_netburp":
|
case "_notice_person_absent_netburp":
|
||||||
if (vars["_context"] != place) return 1;
|
if (vars["_context"] != place) return 1;
|
||||||
break;
|
break;
|
||||||
#if 1
|
|
||||||
case "_failure_unsuccessful_delivery":
|
case "_failure_unsuccessful_delivery":
|
||||||
case "_failure_network_connect_invalid_port":
|
case "_failure_network_connect_invalid_port":
|
||||||
// is this the right place to do this? i have seen a recursion where
|
// is this the right place to do this? i have seen a recursion where
|
||||||
// person.c was never asked for opinion, so i'm putting this into user.c
|
// person.c was never asked for opinion, so i'm putting this into user.c
|
||||||
|
#ifdef ALPHA
|
||||||
|
string loc;
|
||||||
|
foreach (t, loc : v("locations"))
|
||||||
|
if (vars["_source_relay"] == loc) {
|
||||||
|
P1(("%O in %O talking to its %O location at %O.",
|
||||||
|
mc, ME, t, loc))
|
||||||
|
sLocation(t, 0);
|
||||||
|
}
|
||||||
|
#else
|
||||||
// TODO: walk thru entire locations mapping!
|
// TODO: walk thru entire locations mapping!
|
||||||
if (vars["_source_relay"] == v("locations")[0]) {
|
if (vars["_source_relay"] == v("locations")[0]) {
|
||||||
P0(("%O got %O, deleting 0 from %O\n", ME,
|
P0(("%O got %O, deleting 0 from %O\n", ME,
|
||||||
mc, v("locations")))
|
mc, v("locations")))
|
||||||
m_delete(v("locations"), 0);
|
m_delete(v("locations"), 0);
|
||||||
}
|
}
|
||||||
// fall thru - not strictly necessary but adds a feature
|
|
||||||
#endif
|
#endif
|
||||||
|
// fall thru - not strictly necessary but adds a feature
|
||||||
case "_failure_redirect_permanent":
|
case "_failure_redirect_permanent":
|
||||||
// we currently have no implementation for permanent changes
|
// we currently have no implementation for permanent changes
|
||||||
case "_failure_redirect_temporary":
|
case "_failure_redirect_temporary":
|
||||||
@ -1271,7 +1279,8 @@ w(string mc, string data, mapping vars, mixed source, int showingLog) {
|
|||||||
if (!loc) {
|
if (!loc) {
|
||||||
// oh.. happens on beta?
|
// oh.. happens on beta?
|
||||||
P1(("%O late deletion of a %O zero location - should never happen\n", ME, type))
|
P1(("%O late deletion of a %O zero location - should never happen\n", ME, type))
|
||||||
m_delete(v("locations"), type);
|
//m_delete(v("locations"), type);
|
||||||
|
sLocation(type, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user