mirror of
https://github.com/ChronosX88/psyced.git
synced 2024-11-14 14:31:02 +00:00
Merge commit 'origin'
This commit is contained in:
commit
28148762a4
45
CHANGESTODO
45
CHANGESTODO
@ -21,6 +21,14 @@ ________________________________________________________________________
|
|||||||
________________________________________________________________________
|
________________________________________________________________________
|
||||||
== currently being inspected ===========================================
|
== currently being inspected ===========================================
|
||||||
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
|
? /ve/TODO/leave-from-user
|
||||||
|
|
||||||
|
- newbies are allowed to open new owned rooms
|
||||||
|
fippo sagt: ergo brauchst du nen exit-hook der owner löscht wenn der n00b-owner aus dem raum geht
|
||||||
|
|
||||||
|
- double _link does produce an _unlink to the old client, but not the proper
|
||||||
|
place enter events..?
|
||||||
|
|
||||||
- jabber logout isn't announced or offline avail isn't processed
|
- jabber logout isn't announced or offline avail isn't processed
|
||||||
... apparently other side did not logout properly, as it doesn't happen always
|
... apparently other side did not logout properly, as it doesn't happen always
|
||||||
|
|
||||||
@ -60,6 +68,29 @@ ________________________________________________________________________
|
|||||||
tgX sagt: on reconnect i didn't get any _echo_place_enter_login's from this room, then no response for _request_do_enter, and after a _request_do_leave i get replies for enter/leave but instead of _echo_place_enter/leave i get _notice_place_enter/leave
|
tgX sagt: on reconnect i didn't get any _echo_place_enter_login's from this room, then no response for _request_do_enter, and after a _request_do_leave i get replies for enter/leave but instead of _echo_place_enter/leave i get _notice_place_enter/leave
|
||||||
|
|
||||||
? should /load inform that errors go to the console?
|
? should /load inform that errors go to the console?
|
||||||
|
|
||||||
|
________________________________________________________________________
|
||||||
|
:_group psyc://psyced.org/@welcome
|
||||||
|
:_source_identification psyc://xxx.no-ip.org/~xxx
|
||||||
|
|
||||||
|
:_tag msg_406
|
||||||
|
_request_do_message
|
||||||
|
bug!
|
||||||
|
.
|
||||||
|
|
||||||
|
:_source_relay psyc://xxx.no-ip.org/~0
|
||||||
|
:_context psyc://psyced.org/@welcome
|
||||||
|
|
||||||
|
:_nick_place psyc://psyced.org/@welcome
|
||||||
|
:_nick xxx
|
||||||
|
:_time_INTERNAL 1245932297
|
||||||
|
_message_echo_public
|
||||||
|
bug!
|
||||||
|
.
|
||||||
|
|
||||||
|
In welcome spricht «psyc://xxx.no-ip.org/~0» xxx: the bug in the scratchpad. why psyced echoes packets to "~0" instead of my real account? the same thing is for echo_private
|
||||||
|
In welcome spricht «psyc://xxx.no-ip.org/~0» xxx: it should either ignore first packet (if psyced is sure that i'm not authorized with password) or return echo to that account instead of misterious "0"
|
||||||
|
|
||||||
________________________________________________________________________
|
________________________________________________________________________
|
||||||
== psyced 1.0 ==========================================================
|
== psyced 1.0 ==========================================================
|
||||||
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
@ -292,7 +323,9 @@ ________________________________________________________________________
|
|||||||
- move templates from source code into default/en/plain.textdb
|
- move templates from source code into default/en/plain.textdb
|
||||||
.. maybe write an automation to do it? they're just too many!
|
.. maybe write an automation to do it? they're just too many!
|
||||||
|
|
||||||
run more mailcast gateways!! on psyced.org? or elsewhere?
|
+ run more mailcast gateways!! on psyced.org? or elsewhere?
|
||||||
|
like.. gateway for email alerts from http://www.dernewsticker.de/
|
||||||
|
and google alerts obviously
|
||||||
|
|
||||||
- /log 9999999999 produces
|
- /log 9999999999 produces
|
||||||
Numeric overflow: 1410065407 *= 4
|
Numeric overflow: 1410065407 *= 4
|
||||||
@ -340,6 +373,12 @@ WINDOWS DISTRIBUTION
|
|||||||
? how can we compile SRV into erq.exe? do we care?
|
? how can we compile SRV into erq.exe? do we care?
|
||||||
? which open source installer for win to use?
|
? which open source installer for win to use?
|
||||||
? what to do about psyconf.. include perl or re-implement psyconf for win?
|
? what to do about psyconf.. include perl or re-implement psyconf for win?
|
||||||
|
|
||||||
|
TWITTER
|
||||||
|
+ resolve redirect-urls before forwarding to subscriptions, that means,
|
||||||
|
calling http/fetch on http://tr.im/whatever urls until it no longer
|
||||||
|
returns a 30x redirection code. [improves privacy btw, since all those
|
||||||
|
redirect services log your access for the one who installs them]
|
||||||
________________________________________________________________________
|
________________________________________________________________________
|
||||||
== OTHER MAJOR TODOS ===================================================
|
== OTHER MAJOR TODOS ===================================================
|
||||||
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
|
||||||
@ -3929,3 +3968,7 @@ http/fetch
|
|||||||
- minor api cleanups to serve a more generic job
|
- minor api cleanups to serve a more generic job
|
||||||
library/dns
|
library/dns
|
||||||
+ honor #define _flag_disable_trust_localhost
|
+ honor #define _flag_disable_trust_localhost
|
||||||
|
net/irc
|
||||||
|
- bugfix from fippo concerning alias interpretation
|
||||||
|
include/net.h
|
||||||
|
- the efun has changed from stringprep() to idna_stringprep()
|
||||||
|
@ -34,7 +34,10 @@ exit
|
|||||||
enable_use_json=yes
|
enable_use_json=yes
|
||||||
|
|
||||||
# compile expat xml & xmpp parser in, if available
|
# compile expat xml & xmpp parser in, if available
|
||||||
enable_use_expat=yes
|
enable_use_expat=no
|
||||||
|
|
||||||
|
# compile iksemel parser in, if available
|
||||||
|
enable_use_iksemel=no
|
||||||
|
|
||||||
# enable this if you want use http://about.psyc.eu/psyclpc#Authlocal
|
# enable this if you want use http://about.psyc.eu/psyclpc#Authlocal
|
||||||
enable_use_authlocal=yes
|
enable_use_authlocal=yes
|
||||||
|
14
install.sh
14
install.sh
@ -1021,14 +1021,14 @@ _IRC_encrypted = $IRCS_PORT
|
|||||||
_HTTP = $HTTP_PORT
|
_HTTP = $HTTP_PORT
|
||||||
_HTTP_encrypted = $HTTPS_PORT
|
_HTTP_encrypted = $HTTPS_PORT
|
||||||
_applet = $APPLET_PORT
|
_applet = $APPLET_PORT
|
||||||
|
_SMTP = $SMTP_PORT
|
||||||
|
_SMTP_encrypted = $SMTPS_PORT
|
||||||
|
|
||||||
; Experimental protocol services
|
; Experimental protocol services
|
||||||
;_SMTP = $SMTP_PORT
|
_POP3 = $POP3_PORT
|
||||||
;_SMTP_encrypted = $SMTPS_PORT
|
_POP3_encrypted = $POP3S_PORT
|
||||||
;_POP3 = $POP3_PORT
|
_NNTP = $NNTP_PORT
|
||||||
;_POP3_encrypted = $POP3S_PORT
|
_NNTP_encrypted = $NNTPS_PORT
|
||||||
;_NNTP = $NNTP_PORT
|
|
||||||
;_NNTP_encrypted = $NNTPS_PORT
|
|
||||||
|
|
||||||
[_optional]
|
[_optional]
|
||||||
; Enable web-based configuration tool
|
; Enable web-based configuration tool
|
||||||
@ -1079,7 +1079,7 @@ then
|
|||||||
echo "Creating $BASE_DIR..."
|
echo "Creating $BASE_DIR..."
|
||||||
if mkdir -m $BASE_PERM -p $BASE_DIR 2> /dev/null
|
if mkdir -m $BASE_PERM -p $BASE_DIR 2> /dev/null
|
||||||
then
|
then
|
||||||
;
|
echo ""; # nop?
|
||||||
else
|
else
|
||||||
if test "x$userid" = "xroot"
|
if test "x$userid" = "xroot"
|
||||||
then
|
then
|
||||||
|
@ -154,13 +154,13 @@ _PAGES_help_display
|
|||||||
|<b> /trust </b> Befehl gesondert den Vertrauenswert für diese Person.
|
|<b> /trust </b> Befehl gesondert den Vertrauenswert für diese Person.
|
||||||
|
|
|
|
||||||
|<a name="trust" />
|
|<a name="trust" />
|
||||||
|<DT><P><B> /trust <Name> <Ziffer>|- </B></p></dd>
|
|<DT><P><B> /trust <Name> <Ziffer>|- </B></p><dd>
|
||||||
|Gesonderten Vertrauenswert für eine Person einstellen, unabhängig
|
|Gesonderten Vertrauenswert für eine Person einstellen, unabhängig
|
||||||
|vom Freundschaftszustand. Der Wert darf eine Ziffer von 0 bis 9 annehmen
|
|vom Freundschaftszustand. Der Wert darf eine Ziffer von 0 bis 9 annehmen
|
||||||
|oder ein Minuszeichen, um den Normalzustand wieder herzustellen.
|
|oder ein Minuszeichen, um den Normalzustand wieder herzustellen.
|
||||||
|
|
|
|
||||||
|<a name="expose" />
|
|<a name="expose" />
|
||||||
|<DT><P><B> /expose <Name> <Ziffer>|- </B></p></dd>
|
|<DT><P><B> /expose <Name> <Ziffer>|- </B></p><dd>
|
||||||
|Expositionswert für eine Person einstellen. Dieser Faktor bestimmt wie
|
|Expositionswert für eine Person einstellen. Dieser Faktor bestimmt wie
|
||||||
|hoch ein Vertrauenswert eines Bekannten sein muss, damit er diesen
|
|hoch ein Vertrauenswert eines Bekannten sein muss, damit er diesen
|
||||||
|Freund beim betrachten des Profils zu sehen bekommt. Mittels
|
|Freund beim betrachten des Profils zu sehen bekommt. Mittels
|
||||||
@ -515,7 +515,7 @@ _PAGES_help_room
|
|||||||
|die anderen Anwesenden über die Tat des Einladens informieren.
|
|die anderen Anwesenden über die Tat des Einladens informieren.
|
||||||
|
|
|
|
||||||
|<a name="follow"></a>
|
|<a name="follow"></a>
|
||||||
|<p><b> /f(ollow) </b></p><dd>
|
|<dt><p><b> /f(ollow) </b></p><dd>
|
||||||
|Der Empfänger einer Einladung braucht einfach nur <b>/f</b> wie
|
|Der Empfänger einer Einladung braucht einfach nur <b>/f</b> wie
|
||||||
|<b>/follow</b> einzugeben, um jenen Raum zu betreten. Sollte keine
|
|<b>/follow</b> einzugeben, um jenen Raum zu betreten. Sollte keine
|
||||||
|Einladung vorliegen, wird in den zuletzt aktiven Raum gewechselt.
|
|Einladung vorliegen, wird in den zuletzt aktiven Raum gewechselt.
|
||||||
|
@ -236,13 +236,13 @@ _PAGES_help_display
|
|||||||
|<b> /trust </b> command to specify a custom trust level for this person.
|
|<b> /trust </b> command to specify a custom trust level for this person.
|
||||||
|
|
|
|
||||||
|<a name="trust"></a>
|
|<a name="trust"></a>
|
||||||
|<DT><P><B> /trust <Name> <Digit>|- </B></p></dd>
|
|<DT><P><B> /trust <Name> <Digit>|- </B></p><dd>
|
||||||
|Define a custom trust level value for a person. The trust level must
|
|Define a custom trust level value for a person. The trust level must
|
||||||
|be a digit ranging from 0 to 9, or a minus character, which will restore
|
|be a digit ranging from 0 to 9, or a minus character, which will restore
|
||||||
|the default.
|
|the default.
|
||||||
|
|
|
|
||||||
|<a name="expose"></a>
|
|<a name="expose"></a>
|
||||||
|<DT><P><B> /expose <Name> <Digit>|- </B></p></dd>
|
|<DT><P><B> /expose <Name> <Digit>|- </B></p><dd>
|
||||||
|Define the exposure level for a friend. This factor defines how high the
|
|Define the exposure level for a friend. This factor defines how high the
|
||||||
|trust level a person must be, to be enabled to see your friend listed in
|
|trust level a person must be, to be enabled to see your friend listed in
|
||||||
|your profile. By issueing <b> /expose Merlin 0 </b> for instance you can
|
|your profile. By issueing <b> /expose Merlin 0 </b> for instance you can
|
||||||
@ -562,7 +562,7 @@ _PAGES_help_room
|
|||||||
|invitation.
|
|invitation.
|
||||||
|
|
|
|
||||||
|<a name="follow"></a>
|
|<a name="follow"></a>
|
||||||
|<p><b> /f(ollow) </b></p><dd>
|
|<dt><p><b> /f(ollow) </b></p><dd>
|
||||||
|The recipient of an invitation just needs to type <b>/f</b> as in
|
|The recipient of an invitation just needs to type <b>/f</b> as in
|
||||||
|<b>/follow</b> to enter the room. If there was no invitation, then
|
|<b>/follow</b> to enter the room. If there was no invitation, then
|
||||||
|the last active room is selected.
|
|the last active room is selected.
|
||||||
|
@ -364,28 +364,28 @@ _notice_place_leave
|
|||||||
|<presence type='unavailable' to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]' id='[_tag]'><x xmlns='http://jabber.org/protocol/muc#user'><item affiliation='none' role='none'/></x></presence>
|
|<presence type='unavailable' to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]' id='[_tag]'><x xmlns='http://jabber.org/protocol/muc#user'><item affiliation='none' role='none'/></x></presence>
|
||||||
|
|
||||||
_status_presence_here
|
_status_presence_here
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_status_presence_here_talkative
|
_status_presence_here_talkative
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>chat</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>chat</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_status_presence_here_busy
|
_status_presence_here_busy
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>dnd</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>dnd</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_status_presence_away
|
_status_presence_away
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>away</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>away</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_status_presence_absent_vacation
|
_status_presence_absent_vacation
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>xa</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>xa</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_status_presence_absent
|
_status_presence_absent
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]' type='unavailable'><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]' type='unavailable'><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_status_presence_here_quiet
|
_status_presence_here_quiet
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'/>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'/>
|
||||||
|
|
||||||
_notice_presence_here
|
_notice_presence_here
|
||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber_bare]'><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber_bare]'><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_notice_presence_here_plain
|
_notice_presence_here_plain
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'/>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'/>
|
||||||
@ -394,19 +394,19 @@ _notice_presence_here_quiet
|
|||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'/>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'/>
|
||||||
|
|
||||||
_notice_presence_here_talkative
|
_notice_presence_here_talkative
|
||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber_bare]'><show>chat</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber_bare]'><show>chat</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_notice_presence_here_busy
|
_notice_presence_here_busy
|
||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'><show>dnd</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'><show>dnd</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_notice_presence_away
|
_notice_presence_away
|
||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'><show>away</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'><show>away</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_notice_presence_absent_vacation
|
_notice_presence_absent_vacation
|
||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'><show>xa</show><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]'><show>xa</show><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_notice_presence_absent
|
_notice_presence_absent
|
||||||
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]' type='unavailable'><status>[_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
|<presence to='[_INTERNAL_target_jabber_bare]' from='[_INTERNAL_source_jabber]' type='unavailable'><status>[_XML_description_presence]</status><mood xmlns='http://jabber.org/protocol/mood'><[_INTERNAL_mood_jabber]/></mood></presence>
|
||||||
|
|
||||||
_notice_person_absent_netburp
|
_notice_person_absent_netburp
|
||||||
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>xa</show><status>{_notice_person_absent_netburp}</status></presence>
|
|<presence to='[_INTERNAL_target_jabber]' from='[_INTERNAL_source_jabber]'><show>xa</show><status>{_notice_person_absent_netburp}</status></presence>
|
||||||
|
@ -873,6 +873,9 @@ _notice_invitation
|
|||||||
_notice_received_email_UNUSED
|
_notice_received_email_UNUSED
|
||||||
|([_nick_alias]) [_origin]: [_subject]
|
|([_nick_alias]) [_origin]: [_subject]
|
||||||
|
|
||||||
|
_notice_headline_twitter
|
||||||
|
|([_nick_place]) [_headline]
|
||||||
|
|
||||||
_notice_headline_news
|
_notice_headline_news
|
||||||
|([_nick_place]News) [_headline] [_page_news]
|
|([_nick_place]News) [_headline] [_page_news]
|
||||||
|
|
||||||
|
@ -153,7 +153,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// some ldmud versions previous to 610 have a problem with digest-md5
|
// some ldmud versions previous to 610 have a problem with digest-md5
|
||||||
#if __VERSION_MAJOR__ < 4 && __VERSION_MICRO__ < 611
|
//#if __VERSION_MAJOR__ < 4 && __VERSION_MICRO__ < 611
|
||||||
# echo Warning: Your driver is so old, it cannot do DIGEST-MD5
|
//# echo Warning: Your driver is so old, it cannot do DIGEST-MD5
|
||||||
# define _flag_disable_authentication_digest_MD5
|
//# define _flag_disable_authentication_digest_MD5
|
||||||
#endif
|
//#endif
|
||||||
|
@ -53,17 +53,18 @@
|
|||||||
# define DEFAULT_CONTENT_TYPE "text/html; charset=" SYSTEM_CHARSET
|
# define DEFAULT_CONTENT_TYPE "text/html; charset=" SYSTEM_CHARSET
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __EFUN_DEFINED__(stringprep)
|
#if __EFUN_DEFINED__(idna_stringprep) && defined(DRIVER_PATH)
|
||||||
// stringprep needs utf8 arguments
|
// stringprep needs utf8 arguments
|
||||||
// this results in lots of conversions some of which look like
|
// this results in lots of conversions some of which look like
|
||||||
// system->utf>system->utf. luckily UTF8 is our system charset.
|
// system->utf>system->utf. luckily UTF8 is our system charset.
|
||||||
// so FROM_UTF8 and TO_UTF8 are normally nullmacros (see above)
|
// so FROM_UTF8 and TO_UTF8 are normally nullmacros (see above)
|
||||||
# include <idn.h>
|
# include DRIVER_PATH "sys/idn.h"
|
||||||
// beware, these macros dont have error handling...
|
// beware, these macros dont have error handling...
|
||||||
# define NODEPREP(s) FROM_UTF8(stringprep(TO_UTF8(s), STRINGPREP_XMPP_NODEPREP))
|
# define NODEPREP(s) FROM_UTF8(idna_stringprep(TO_UTF8(s), STRINGPREP_XMPP_NODEPREP))
|
||||||
# define NAMEPREP(s) FROM_UTF8(stringprep(TO_UTF8(s), STRINGPREP_NAMEPREP))
|
# define NAMEPREP(s) FROM_UTF8(idna_stringprep(TO_UTF8(s), STRINGPREP_NAMEPREP))
|
||||||
# define RESOURCEPREP(s) FROM_UTF8(stringprep(TO_UTF8(s), STRINGPREP_XMPP_RESOURCEPREP))
|
# define RESOURCEPREP(s) FROM_UTF8(idna_stringprep(TO_UTF8(s), STRINGPREP_XMPP_RESOURCEPREP))
|
||||||
#else
|
#else
|
||||||
|
# echo Warning: using lower_case instead of idna_stringprep!
|
||||||
# define NODEPREP(s) lower_case(s)
|
# define NODEPREP(s) lower_case(s)
|
||||||
# define NAMEPREP(s) lower_case(s)
|
# define NAMEPREP(s) lower_case(s)
|
||||||
# define RESOURCEPREP(s) (s)
|
# define RESOURCEPREP(s) (s)
|
||||||
|
@ -23,6 +23,27 @@
|
|||||||
|
|
||||||
#define PPL_NOTIFY 1
|
#define PPL_NOTIFY 1
|
||||||
|
|
||||||
|
// this model does not handle the "None + Pending Out/In" state in
|
||||||
|
// http://xmpp.org/rfcs/rfc3921.html#substates - in psyc, if two
|
||||||
|
// people intend to subscribe to each other, they are either upgraded
|
||||||
|
// to friendship aka "Both," or rather - the actual subscription state
|
||||||
|
// on the other side is not stored here, except for the special case
|
||||||
|
// of PPL_NOTIFY_OFFERED.
|
||||||
|
//
|
||||||
|
// if a full implementation of XMPP requires local storage of whether the
|
||||||
|
// other side intends to send us presence (even though she can actually do
|
||||||
|
// whatever she wants, so the information doesn't seem very useful and is
|
||||||
|
// in fact very likely to go out of sync), we'd have to add a new flag class.
|
||||||
|
// something like PPL_SUBSCRIBED or PPL_FOLLOW.
|
||||||
|
//
|
||||||
|
// this all clashes with the PSYC model of context subscriptions - we should
|
||||||
|
// throw away all of these PPL_ subscription flags, and model all xmpp
|
||||||
|
// friendship states with generic context subscriptions - no matter if we
|
||||||
|
// are dealing with people, places or other pubsub apps. seen from this
|
||||||
|
// perspective, "None + Pending Out/In" is equivalent to a pair of
|
||||||
|
// _request_context_subscribe's which haven't been answered yet. we need
|
||||||
|
// a generic per-entity way to store these states, below user level.
|
||||||
|
//
|
||||||
#define PPL_NOTIFY_IMMEDIATE '8'
|
#define PPL_NOTIFY_IMMEDIATE '8'
|
||||||
#define PPL_NOTIFY_DEFAULT PPL_NOTIFY_IMMEDIATE
|
#define PPL_NOTIFY_DEFAULT PPL_NOTIFY_IMMEDIATE
|
||||||
#define PPL_NOTIFY_DELAYED '6'
|
#define PPL_NOTIFY_DELAYED '6'
|
||||||
|
@ -395,6 +395,9 @@ w(string mc, string data, mapping vars, mixed source) {
|
|||||||
} else if (abbrev("_echo_place_enter", mc)) {
|
} else if (abbrev("_echo_place_enter", mc)) {
|
||||||
vars["_INTERNAL_source_IRC"] = MYNICK + "!" + MYNICK + "@" SERVER_HOST;
|
vars["_INTERNAL_source_IRC"] = MYNICK + "!" + MYNICK + "@" SERVER_HOST;
|
||||||
#endif
|
#endif
|
||||||
|
} else if (source == "/") { // new style server root message
|
||||||
|
vars["_INTERNAL_source_IRC"] = SERVER_HOST;
|
||||||
|
nick2 = source = SERVER_UNIFORM;
|
||||||
} else {
|
} else {
|
||||||
#ifdef GHOST //{{{
|
#ifdef GHOST //{{{
|
||||||
// in S2S mode we are not supposed to deliver nick!user@host
|
// in S2S mode we are not supposed to deliver nick!user@host
|
||||||
@ -843,7 +846,7 @@ logon() {
|
|||||||
// but i guess it is indeed appropriate to make it clear how very much
|
// but i guess it is indeed appropriate to make it clear how very much
|
||||||
// different we are from a regular irc server.
|
// different we are from a regular irc server.
|
||||||
//
|
//
|
||||||
reply(RPL_ISUPPORT, "PSYC=.99 ALIAS AVAILABILITY FRIEND HISTORY MOOD SHOUT SSET STATUS SUBSCRIBE THREAD TRUST PREFIX= CHANTYPES=# CHANMODES= NICKLEN="+ (string)MAX_UNIFORM_LEN +" CHANNELLEN="+ (string)MAX_UNIFORM_LEN +" CASEMAPPING=ascii TOPICLEN=4404 KICKLEN=4404 AWAYLEN=4404 MAXTARGETS=1 CHARSET="+ (v("charset")||SYSTEM_CHARSET) +" NETWORK=PSYC CTCP=PRESENCE,TS UNIFORMS=psyc,xmpp :are supported by this server");
|
reply(RPL_ISUPPORT, "PSYC=.99 ALIAS AVAILABILITY FRIEND HISTORY MOOD SHOUT SSET STATUS SUBSCRIBE THREAD TRUST PREFIX= CHANTYPES=# CHANMODES= NICKLEN="+ (string)MAX_UNIFORM_LEN +" CHANNELLEN="+ (string)MAX_UNIFORM_LEN +" CASEMAPPING=ascii TOPICLEN=4404 KICKLEN=4404 AWAYLEN=4404 MAXTARGETS=1 CHARSET="+ (v("charset")||SYSTEM_CHARSET) +" NETWORK=" SERVER_HOST " CTCP=PRESENCE,TS UNIFORMS=psyc,xmpp :are supported by this server");
|
||||||
//
|
//
|
||||||
// MAXCHANNELS vs CHANLIMIT - we currently only have a limit on subs
|
// MAXCHANNELS vs CHANLIMIT - we currently only have a limit on subs
|
||||||
// STD? what the hell is STD?
|
// STD? what the hell is STD?
|
||||||
@ -853,12 +856,15 @@ logon() {
|
|||||||
// MAXNICKLEN?
|
// MAXNICKLEN?
|
||||||
// neue befehle: IGNORE vs SILENCE? SHOW? MASQUERADE?
|
// neue befehle: IGNORE vs SILENCE? SHOW? MASQUERADE?
|
||||||
//
|
//
|
||||||
// PSYC as network name is not a #define, since any psyc server is
|
// NETWORK:=
|
||||||
// a gateway to the complete PSYC. introducing network names here is
|
// We used to have PSYC as the network name, as no matter which
|
||||||
// misleading and not useful thing to do. that's why it is statically
|
// PSYC server you use, you are always connected to the entire
|
||||||
// PSYC, nothing more or less.
|
// PSYCspace. But now we use the hostname as the network name,
|
||||||
|
// because you may want your IRC client to connect multiple
|
||||||
|
// identities on multiple hosts and not get confused.
|
||||||
|
// Maybe we should even use something like user@host at this point.
|
||||||
//
|
//
|
||||||
// nei suggests: ALIAS SUBSCRIBE FRIEND SET SSET SILENCE CHANTYPES=# PREFIX= CHANMODES= CMDCHAR=+ ACTIONCHAR=: EINOTIFY=notify LANGUAGE=en CHARSET_PAYLOAD=utf-8 CHARSET=utf-8 NETWORK=psyc UNIFORM_NICK UNIFORM_CHAN
|
// nei suggests: ALIAS SUBSCRIBE FRIEND SET SSET SILENCE CHANTYPES=# PREFIX= CHANMODES= CMDCHAR=+ ACTIONCHAR=: EINOTIFY=notify LANGUAGE=en CHARSET_PAYLOAD=utf-8 CHARSET=utf-8 NETWORK=... UNIFORM_NICK UNIFORM_CHAN
|
||||||
// SILENCE: ach und ich weiss nicht ob /quote silence bzw /silence den psyced befehl silence aufruft, aber imo sollte er das aus verwirrungs-vermeidungs-gruenden nicht tun. silence im irc ist serverseitiges ignore.
|
// SILENCE: ach und ich weiss nicht ob /quote silence bzw /silence den psyced befehl silence aufruft, aber imo sollte er das aus verwirrungs-vermeidungs-gruenden nicht tun. silence im irc ist serverseitiges ignore.
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
@ -296,12 +296,24 @@ render(string mc, string data, mapping vars, mixed source) {
|
|||||||
log_file("XMPP_TODO", "%O %s %s\n", ME, mc, output);
|
log_file("XMPP_TODO", "%O %s %s\n", ME, mc, output);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
// hack for a special case where status update contains <, >
|
||||||
|
// if this kind of problem recurrs, we should quote every
|
||||||
|
// single damn variable
|
||||||
|
if (vars["_description_presence"])
|
||||||
|
vars["_XML_description_presence"] =
|
||||||
|
xmlquote(vars["_description_presence"]);
|
||||||
if (stringp(data)) data = xmlquote(data);
|
if (stringp(data)) data = xmlquote(data);
|
||||||
else if (vars["_action"])
|
else if (vars["_action"])
|
||||||
data = "/me " + xmlquote(vars["_action"]);
|
data = "/me " + xmlquote(vars["_action"]);
|
||||||
output = psyctext(template, vars, data, source);
|
output = psyctext(template, vars, data, source);
|
||||||
if (!stringp(output) || output=="")
|
if (!stringp(output) || output=="")
|
||||||
return P2(("jabber:w() no output\n"));
|
return P2(("jabber:w() no output\n"));
|
||||||
|
#if 0
|
||||||
|
if (strstr(output, "r00t") >= 0) {
|
||||||
|
P0(("common:render(%O, %O, %O, %O) -> %O\n", mc,
|
||||||
|
data, vars, source, output))
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#if __EFUN_DEFINED__(convert_charset) && SYSTEM_CHARSET != "UTF-8"
|
#if __EFUN_DEFINED__(convert_charset) && SYSTEM_CHARSET != "UTF-8"
|
||||||
if (catch(output = convert_charset(output,
|
if (catch(output = convert_charset(output,
|
||||||
@ -448,10 +460,11 @@ certificate_check_jabbername(name, cert) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* get first child of a node
|
/* get first child of a node used for <iq/>
|
||||||
* used for <iq/>
|
* "first" is actually inaccurate, since there is no defined order in mappings,
|
||||||
|
* so we select the child, that is not an error
|
||||||
*/
|
*/
|
||||||
getfirstchild(node) {
|
getiqchild(node) {
|
||||||
mixed res;
|
mixed res;
|
||||||
foreach(mixed key, mixed val : node) {
|
foreach(mixed key, mixed val : node) {
|
||||||
unless(stringp(key) && key[0] == '/') continue;
|
unless(stringp(key) && key[0] == '/') continue;
|
||||||
|
@ -550,6 +550,8 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) {
|
|||||||
vars["_description_presence"] =
|
vars["_description_presence"] =
|
||||||
(node["/status"] && node["/status"][Cdata]) ?
|
(node["/status"] && node["/status"][Cdata]) ?
|
||||||
node["/status"][Cdata] : ""; // "Get psyced!";
|
node["/status"][Cdata] : ""; // "Get psyced!";
|
||||||
|
vars["_XML_description_presence"] =
|
||||||
|
xmlquote(vars["_description_presence"]);
|
||||||
vars["_INTERNAL_mood_jabber"] = "neutral";
|
vars["_INTERNAL_mood_jabber"] = "neutral";
|
||||||
sendmsg(o, "_notice_presence_absent", 0,
|
sendmsg(o, "_notice_presence_absent", 0,
|
||||||
vars, origin);
|
vars, origin);
|
||||||
@ -693,6 +695,8 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) {
|
|||||||
vars["_description_presence"] =
|
vars["_description_presence"] =
|
||||||
(node["/status"] && node["/status"][Cdata]) ?
|
(node["/status"] && node["/status"][Cdata]) ?
|
||||||
node["/status"][Cdata] : ""; // "Get psyced!";
|
node["/status"][Cdata] : ""; // "Get psyced!";
|
||||||
|
vars["_XML_description_presence"] =
|
||||||
|
xmlquote(vars["_description_presence"]);
|
||||||
vars["_degree_availability"] = jabber2avail[node["/show"]
|
vars["_degree_availability"] = jabber2avail[node["/show"]
|
||||||
&& node["/show"][Cdata]];
|
&& node["/show"][Cdata]];
|
||||||
// this message is too verbose, let's put in into
|
// this message is too verbose, let's put in into
|
||||||
@ -716,8 +720,8 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) {
|
|||||||
break;
|
break;
|
||||||
case "iq":
|
case "iq":
|
||||||
{
|
{
|
||||||
mixed firstchild = getfirstchild(node);
|
mixed iqchild = getiqchild(node);
|
||||||
string xmlns = firstchild ? firstchild["@xmlns"] : 0;
|
string xmlns = iqchild ? iqchild["@xmlns"] : 0;
|
||||||
// TODO: maybe this should be handled by several functions
|
// TODO: maybe this should be handled by several functions
|
||||||
// iq_get, iq_set, iq_result, iq_error
|
// iq_get, iq_set, iq_result, iq_error
|
||||||
t = node["@type"];
|
t = node["@type"];
|
||||||
@ -790,8 +794,8 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "http://jabber.org/protocol/disco#info":
|
case "http://jabber.org/protocol/disco#info":
|
||||||
if (firstchild["@node"])
|
if (iqchild["@node"])
|
||||||
vars["_target_fragment"] = firstchild["@node"];
|
vars["_target_fragment"] = iqchild["@node"];
|
||||||
if (tu[UUser])
|
if (tu[UUser])
|
||||||
o = FIND_OBJECT(tu[UUser]);
|
o = FIND_OBJECT(tu[UUser]);
|
||||||
else
|
else
|
||||||
@ -807,8 +811,8 @@ jabberMsg(XMLNode node, mixed origin, mixed *su, array(mixed) tu) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "http://jabber.org/protocol/disco#items":
|
case "http://jabber.org/protocol/disco#items":
|
||||||
if (firstchild["@node"])
|
if (iqchild["@node"])
|
||||||
vars["_target_fragment"] = firstchild["@node"];
|
vars["_target_fragment"] = iqchild["@node"];
|
||||||
if (tu[UUser])
|
if (tu[UUser])
|
||||||
o = FIND_OBJECT(tu[UUser]);
|
o = FIND_OBJECT(tu[UUser]);
|
||||||
else
|
else
|
||||||
|
@ -250,11 +250,12 @@ showFriends() {
|
|||||||
"_INTERNAL_target_jabber" : myjid,
|
"_INTERNAL_target_jabber" : myjid,
|
||||||
"_INTERNAL_source_jabber" : mkjid(person),
|
"_INTERNAL_source_jabber" : mkjid(person),
|
||||||
"_description_presence" : "", // TODO: get these from state
|
"_description_presence" : "", // TODO: get these from state
|
||||||
|
"_XML_description_presence" : "",
|
||||||
"_INTERNAL_mood_jabber" : "neutral"
|
"_INTERNAL_mood_jabber" : "neutral"
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
if (strlen(packet)) emit(packet);
|
if (strlen(packet)) emit(packet);
|
||||||
PT(("%O jabberish showFriends: %O outputs as %O\n", ME, friends, packet))
|
P2(("%O jabberish showFriends: %O outputs as %O\n", ME, friends, packet))
|
||||||
}
|
}
|
||||||
|
|
||||||
logon() {
|
logon() {
|
||||||
@ -558,7 +559,7 @@ iq(XMLNode node) {
|
|||||||
string target;
|
string target;
|
||||||
string friend;
|
string friend;
|
||||||
XMLNode helper;
|
XMLNode helper;
|
||||||
XMLNode firstchild;
|
XMLNode iqchild;
|
||||||
string t;
|
string t;
|
||||||
string packet;
|
string packet;
|
||||||
string template;
|
string template;
|
||||||
@ -569,9 +570,9 @@ iq(XMLNode node) {
|
|||||||
target = jid2ppl(node["@to"]);
|
target = jid2ppl(node["@to"]);
|
||||||
isplacemsg = stringp(target) && strlen(target) && ISPLACEMSG(target);
|
isplacemsg = stringp(target) && strlen(target) && ISPLACEMSG(target);
|
||||||
|
|
||||||
P0(("+++ %O IQ node %O\n", ME, node))
|
P3(("+++ %O IQ node %O\n", ME, node))
|
||||||
firstchild = getfirstchild(node);
|
iqchild = getiqchild(node);
|
||||||
unless(firstchild) switch(node["@type"]) {
|
unless(iqchild) switch(node["@type"]) {
|
||||||
case "get":
|
case "get":
|
||||||
case "set":
|
case "set":
|
||||||
case "result":
|
case "result":
|
||||||
@ -581,9 +582,9 @@ iq(XMLNode node) {
|
|||||||
P1(("%O got invalid iq %O\n", ME, node))
|
P1(("%O got invalid iq %O\n", ME, node))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
helper = firstchild;
|
helper = iqchild;
|
||||||
|
|
||||||
switch(firstchild["@xmlns"]) {
|
switch(iqchild["@xmlns"]) {
|
||||||
case "jabber:iq:version":
|
case "jabber:iq:version":
|
||||||
switch(node["@type"]) {
|
switch(node["@type"]) {
|
||||||
case "get":
|
case "get":
|
||||||
@ -978,16 +979,16 @@ iq(XMLNode node) {
|
|||||||
packet += "</blocklist></iq>";
|
packet += "</blocklist></iq>";
|
||||||
break;
|
break;
|
||||||
case "set":
|
case "set":
|
||||||
if (firstchild["/item"] && !nodelistp(firstchild["/item"]))
|
if (iqchild["/item"] && !nodelistp(iqchild["/item"]))
|
||||||
firstchild["/item"] = ({ firstchild["/item"] });
|
iqchild["/item"] = ({ iqchild["/item"] });
|
||||||
unless(firstchild["/item"]) { /* clear the blocklist */
|
unless(iqchild["/item"]) { /* clear the blocklist */
|
||||||
foreach(mixed p, mixed val : ppl) {
|
foreach(mixed p, mixed val : ppl) {
|
||||||
if (val[PPL_DISPLAY] == PPL_DISPLAY_NONE)
|
if (val[PPL_DISPLAY] == PPL_DISPLAY_NONE)
|
||||||
sPerson(p, PPL_DISPLAY, PPL_DISPLAY_DEFAULT);
|
sPerson(p, PPL_DISPLAY, PPL_DISPLAY_DEFAULT);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int block = firstchild[Tag] == "block";
|
int block = iqchild[Tag] == "block";
|
||||||
foreach (helper : firstchild["/item"]) {
|
foreach (helper : iqchild["/item"]) {
|
||||||
/* add/remove each item to/from the blocklist */
|
/* add/remove each item to/from the blocklist */
|
||||||
if (block) {
|
if (block) {
|
||||||
/* TODO:
|
/* TODO:
|
||||||
@ -1212,6 +1213,7 @@ varargs string mkjid(mixed who, mixed vars, mixed ignore_nick, mixed ignore_cont
|
|||||||
// message rendering a la jabber
|
// message rendering a la jabber
|
||||||
w(string mc, string data, mapping vars, mixed source) {
|
w(string mc, string data, mapping vars, mixed source) {
|
||||||
mixed t;
|
mixed t;
|
||||||
|
|
||||||
unless (mappingp(vars)) vars = ([]);
|
unless (mappingp(vars)) vars = ([]);
|
||||||
else if (vars["_nick_verbatim"]) vars["_nick"] = vars["_nick_verbatim"];
|
else if (vars["_nick_verbatim"]) vars["_nick"] = vars["_nick_verbatim"];
|
||||||
// ^^ this is a temporary workaround until we fix the real problem!
|
// ^^ this is a temporary workaround until we fix the real problem!
|
||||||
@ -1284,7 +1286,11 @@ w(string mc, string data, mapping vars, mixed source) {
|
|||||||
unless (vars["_tag_reply"]) vars["_tag_reply"] = tag;
|
unless (vars["_tag_reply"]) vars["_tag_reply"] = tag;
|
||||||
if (vars["_list_groups"])
|
if (vars["_list_groups"])
|
||||||
vars["_list_groups"] = IMPLODE_XML(vars["_list_groups"], "<group>");
|
vars["_list_groups"] = IMPLODE_XML(vars["_list_groups"], "<group>");
|
||||||
|
#if 0
|
||||||
|
if (stringp(data) && strstr(data, "r00t") >= 0) {
|
||||||
|
P0(("user:w(%O, %O, %O, %O)\n", mc, data, vars, source))
|
||||||
|
}
|
||||||
|
#endif
|
||||||
unless (interactive(ME)) {
|
unless (interactive(ME)) {
|
||||||
P1(("%O not interactive. w(%O) from %O.\n", ME, mc, source))
|
P1(("%O not interactive. w(%O) from %O.\n", ME, mc, source))
|
||||||
return;
|
return;
|
||||||
|
@ -527,7 +527,7 @@ PROTECTED mixed nextObject() {
|
|||||||
if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
|
if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
|
||||||
int a; float b_; string c_;
|
int a; float b_; string c_;
|
||||||
sscanf(s, "%d%s", a, c_);
|
sscanf(s, "%d%s", a, c_);
|
||||||
if(c_ && sizeof(c_)) {
|
if ((c_ && sizeof(c_))) {
|
||||||
#ifdef __PIKE__
|
#ifdef __PIKE__
|
||||||
sscanf(s, "%f", b_);
|
sscanf(s, "%f", b_);
|
||||||
#else
|
#else
|
||||||
@ -535,6 +535,18 @@ PROTECTED mixed nextObject() {
|
|||||||
#endif
|
#endif
|
||||||
return b_;
|
return b_;
|
||||||
}
|
}
|
||||||
|
if (!a || s != to_string(a)) {
|
||||||
|
// some values of json ints exceed the limits of MAX_INT.
|
||||||
|
// in that case we tried to use float, but rendering floats
|
||||||
|
// will produce something like 2.17734e+09 instead of just
|
||||||
|
// a long integer. we have to return a string here, and risk
|
||||||
|
// to run into runtime errors. we should probably stop trying
|
||||||
|
// to convert json integers into ints in the first place.
|
||||||
|
// javascript and lpc just aren't compatible. do we have a
|
||||||
|
// bignum package for ldmud?
|
||||||
|
P3(("Warning: JSON integer too big. Returning %O as string.\n", s))
|
||||||
|
return s;
|
||||||
|
}
|
||||||
else return a;
|
else return a;
|
||||||
}
|
}
|
||||||
if (s == "") {
|
if (s == "") {
|
||||||
|
@ -572,7 +572,13 @@ htget(prot, query, headers, qs, data, noprocess) {
|
|||||||
write("\ndocument."+ (query["name"] || MYLOWERNICK)
|
write("\ndocument."+ (query["name"] || MYLOWERNICK)
|
||||||
+ " = new Array(\n");
|
+ " = new Array(\n");
|
||||||
logView(a, "ecmascript", 15);
|
logView(a, "ecmascript", 15);
|
||||||
write(" \""+ implode(names(), ", ")+"\")\n\n");
|
write(" \""+ implode(names(), ", ")+"\""
|
||||||
|
#if defined(ALPHA) && defined(PLACE_TOPIC)
|
||||||
|
// this adds current topic to data structure
|
||||||
|
// but probably breaks all psyclog.js code
|
||||||
|
",\n\t\""+ v("topic") +"\""
|
||||||
|
#endif
|
||||||
|
")\n\n");
|
||||||
break;
|
break;
|
||||||
#if 0
|
#if 0
|
||||||
case "json":
|
case "json":
|
||||||
@ -1312,7 +1318,7 @@ msg(source, mc, data, mapping vars) {
|
|||||||
if (isValidRelay(source)
|
if (isValidRelay(source)
|
||||||
|| isValidRelay(vars["_source_relay"])
|
|| isValidRelay(vars["_source_relay"])
|
||||||
|| isValidRelay(vars["_context"])) {
|
|| isValidRelay(vars["_context"])) {
|
||||||
P1(("yes. cast & out.\n"))
|
P1(("yes. cast & out: %O in %O\n", source, ME))
|
||||||
return castPresence(source, mc, data, vars,
|
return castPresence(source, mc, data, vars,
|
||||||
// don't broadcast the user's presence
|
// don't broadcast the user's presence
|
||||||
!neu || v("_filter_presence"));
|
!neu || v("_filter_presence"));
|
||||||
|
@ -177,14 +177,23 @@ static varargs string psyc_render(mixed source, string mc, mixed data,
|
|||||||
data = data? to_string(data): "";
|
data = data? to_string(data): "";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (data == S_GLYPH_PACKET_DELIMITER || (strlen(data) > 1 &&
|
else if (data == S_GLYPH_PACKET_DELIMITER ||
|
||||||
|
# ifdef SPYC
|
||||||
|
// just some random limit that makes us prefer _length
|
||||||
|
// over scanning data for illegal characters
|
||||||
|
strlen(data) > 444 ||
|
||||||
|
# endif
|
||||||
|
(strlen(data) > 1 &&
|
||||||
data[0] == C_GLYPH_PACKET_DELIMITER && data[1] == '\n')
|
data[0] == C_GLYPH_PACKET_DELIMITER && data[1] == '\n')
|
||||||
|| strstr(data, "\n" S_GLYPH_PACKET_DELIMITER "\n") != -1) {
|
|| strstr(data, "\n" S_GLYPH_PACKET_DELIMITER "\n") != -1) {
|
||||||
// this check shouldn't be necessary here: we should check what
|
// we could check what people are typing in usercmd.. then
|
||||||
// people are typing in usercmd
|
// again, "illegal" data may also come in from XMPP, and
|
||||||
|
// anything should be legal in PSYC.. so let's handle it here.
|
||||||
# ifdef SPYC
|
# ifdef SPYC
|
||||||
needLen++;
|
needLen++;
|
||||||
# else
|
# else
|
||||||
|
// old psyc syntax has no clean solution to this problem,
|
||||||
|
// so we just censor the message. use the new syntax!
|
||||||
P1(("%O: %O tried to send %O via psyc. censored.\n",
|
P1(("%O: %O tried to send %O via psyc. censored.\n",
|
||||||
previous_object() || ME, vars["_nick"] || vars, data))
|
previous_object() || ME, vars["_nick"] || vars, data))
|
||||||
data = "*** censored message ***";
|
data = "*** censored message ***";
|
||||||
|
@ -187,7 +187,7 @@ int psyc_sendmsg(mixed target, string mc, mixed data, mapping vars,
|
|||||||
int showingLog, mixed source, array(mixed) u) {
|
int showingLog, mixed source, array(mixed) u) {
|
||||||
string sname, host, buf, room;
|
string sname, host, buf, room;
|
||||||
int port, usesrv = 1;
|
int port, usesrv = 1;
|
||||||
object o;
|
object ob;
|
||||||
mixed t;
|
mixed t;
|
||||||
|
|
||||||
unless (u[UHost]) {
|
unless (u[UHost]) {
|
||||||
@ -246,15 +246,15 @@ int psyc_sendmsg(mixed target, string mc, mixed data, mapping vars,
|
|||||||
if (query_udp_port() == port && is_localhost(host)) {
|
if (query_udp_port() == port && is_localhost(host)) {
|
||||||
// this happens when a psyc client sends to a local
|
// this happens when a psyc client sends to a local
|
||||||
// target that hasn't been incarnated yet...
|
// target that hasn't been incarnated yet...
|
||||||
o = find_psyc_object(u);
|
ob = find_psyc_object(u);
|
||||||
// cache the resulting object for the url
|
// cache the resulting object for the url
|
||||||
if (o) {
|
if (ob) {
|
||||||
P2(("psyc_sendmsg registering %O for %O found by parsing uniform\n",
|
P2(("psyc_sendmsg registering %O for %O found by parsing uniform\n",
|
||||||
target, o))
|
target, ob))
|
||||||
register_target(target, o);
|
register_target(target, ob);
|
||||||
}
|
}
|
||||||
#ifndef __PIKE__ // TPD
|
#ifndef __PIKE__ // TPD
|
||||||
return sendmsg(o, mc, data, vars, source);
|
return sendmsg(ob, mc, data, vars, source);
|
||||||
#endif
|
#endif
|
||||||
// or deliver directly?
|
// or deliver directly?
|
||||||
}
|
}
|
||||||
|
@ -108,11 +108,12 @@ list_sockets(guy, flags) {
|
|||||||
#endif
|
#endif
|
||||||
#if __EFUN_DEFINED__(tls_query_connection_info)
|
#if __EFUN_DEFINED__(tls_query_connection_info)
|
||||||
tls ? intp(tls[TLS_PROT]) ?
|
tls ? intp(tls[TLS_PROT]) ?
|
||||||
TLS_PROT_NAME(tls[TLS_PROT]) :
|
TLS_PROT_NAME(tls[TLS_PROT]) ||
|
||||||
tls[TLS_PROT] : "",
|
to_string(tls[TLS_PROT]) : tls[TLS_PROT] : "",
|
||||||
tls ? intp(tls[TLS_CIPHER]) ?
|
tls ? intp(tls[TLS_CIPHER]) ?
|
||||||
TLS_CIPHER_NAME(tls[TLS_CIPHER]) :
|
TLS_CIPHER_NAME(tls[TLS_CIPHER])
|
||||||
tls[TLS_CIPHER] : ""
|
|| to_string(tls[TLS_CIPHER])
|
||||||
|
: tls[TLS_CIPHER] : ""
|
||||||
#else
|
#else
|
||||||
"", ""
|
"", ""
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
|
|
||||||
persistent int lastid;
|
persistent mixed lastid;
|
||||||
|
|
||||||
volatile object feed;
|
volatile object feed;
|
||||||
|
|
||||||
@ -28,18 +28,29 @@ parse(string body, mapping headers) {
|
|||||||
P4((body))
|
P4((body))
|
||||||
//#endif
|
//#endif
|
||||||
unless (pointerp(wurst = parse_json(body))) {
|
unless (pointerp(wurst = parse_json(body))) {
|
||||||
P1(("%O failed to parse its timeline.\n", ME))
|
monitor_report("_failure_network_fetch_twitter_empty",
|
||||||
|
"[_source] failed to parse its timeline");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
unless (sizeof(wurst)) {
|
unless (sizeof(wurst)) {
|
||||||
P1(("%O received an empty structure.\n", ME))
|
monitor_report("_failure_network_fetch_twitter_empty",
|
||||||
|
"[_source] received an empty structure.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (wurst[0]["id"] <= lastid) {
|
// this used to fail on MAX_INT turning the ints to negative.. it would work for
|
||||||
P1(("%O received %d old updates.\n", ME, sizeof(wurst)))
|
// a while longer using floats, but since floating point mantissa in lpc is only
|
||||||
|
// 32 bits wide, it's just a question of time until we hit that roof again (when
|
||||||
|
// status_id reaches 4294967296). so let's try strings instead. funny to run into
|
||||||
|
// such a weird problem only after years that twitter has been in existence.
|
||||||
|
// twitterific may have run into the same problem, as the timing of its breakdown
|
||||||
|
// matches ours.
|
||||||
|
if (lastid && wurst[0]["id"] <= lastid) {
|
||||||
|
P1(("%O received %d old updates (id0 %O <= lastid %O).\n",
|
||||||
|
ME, sizeof(wurst), wurst[0]["id"], lastid))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
lastid = wurst[0]["id"];
|
lastid = wurst[0]["id"];
|
||||||
|
P2(("%O -- new lastid %O\n", ME, lastid))
|
||||||
save_object(DATA_PATH "twitter");
|
save_object(DATA_PATH "twitter");
|
||||||
for (i=sizeof(wurst)-1; i>=0; i--) {
|
for (i=sizeof(wurst)-1; i>=0; i--) {
|
||||||
d = wurst[i];
|
d = wurst[i];
|
||||||
@ -99,7 +110,7 @@ parse(string body, mapping headers) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fetch() {
|
fetch() {
|
||||||
P1(("%O going to fetch from %O since %O\n", ME, feed, lastid))
|
P2(("%O going to fetch from %O since %O\n", ME, feed, lastid))
|
||||||
call_out( #'fetch, 4 * 59 ); // odd is better
|
call_out( #'fetch, 4 * 59 ); // odd is better
|
||||||
feed -> content( #'parse, 1, 1 );
|
feed -> content( #'parse, 1, 1 );
|
||||||
// twitter ignores since_id if count is present. stupid.
|
// twitter ignores since_id if count is present. stupid.
|
||||||
|
@ -435,8 +435,10 @@ msg(source, mc, data, mapping vars, showingLog) {
|
|||||||
&& abbrev(SERVER_UNIFORM +"~", source))
|
&& abbrev(SERVER_UNIFORM +"~", source))
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
|
#ifdef PRO_PATH
|
||||||
if (data && index(data, '\n') != -1)
|
if (data && index(data, '\n') != -1)
|
||||||
data = replace(data, "\n", " ");
|
data = replace(data, "\n", " ");
|
||||||
|
#endif
|
||||||
#ifdef USE_THE_NICK
|
#ifdef USE_THE_NICK
|
||||||
if (t != source) {
|
if (t != source) {
|
||||||
if (objectp(source)) {
|
if (objectp(source)) {
|
||||||
|
@ -1895,6 +1895,7 @@ motto(t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private talk(to, handleAliases) {
|
private talk(to, handleAliases) {
|
||||||
|
// check if we are already in a query with this person.. here?
|
||||||
if (to) {
|
if (to) {
|
||||||
string tn;
|
string tn;
|
||||||
// looking for a bug.. intermediate hack here..
|
// looking for a bug.. intermediate hack here..
|
||||||
@ -3426,6 +3427,7 @@ teleport(where, mcv, quiet, stay, morevars) {
|
|||||||
}
|
}
|
||||||
unless(mcv) mcv = "";
|
unless(mcv) mcv = "";
|
||||||
if (place && member(places, place)) {
|
if (place && member(places, place)) {
|
||||||
|
#ifndef EXPERIMENTAL // ALTE_SCHULE
|
||||||
if (place == where) {
|
if (place == where) {
|
||||||
P3(("teleport: %O is already in %O\n", ME, place))
|
P3(("teleport: %O is already in %O\n", ME, place))
|
||||||
// why error.. this should be a _warning !!
|
// why error.. this should be a _warning !!
|
||||||
@ -3438,6 +3440,7 @@ teleport(where, mcv, quiet, stay, morevars) {
|
|||||||
// here's a kludge to not return in that case:
|
// here's a kludge to not return in that case:
|
||||||
unless (morevars) return;
|
unless (morevars) return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (NICKPLACE) {
|
if (NICKPLACE) {
|
||||||
vSet("lastplace", NICKPLACE);
|
vSet("lastplace", NICKPLACE);
|
||||||
unless (stay) {
|
unless (stay) {
|
||||||
@ -3463,8 +3466,10 @@ teleport(where, mcv, quiet, stay, morevars) {
|
|||||||
if (places[where]) {
|
if (places[where]) {
|
||||||
place = where;
|
place = where;
|
||||||
vSet("place", objectp(where) ? where->qName() : where);
|
vSet("place", objectp(where) ? where->qName() : where);
|
||||||
|
#ifndef EXPERIMENTAL // ALTE_SCHULE
|
||||||
unless(quiet) showRoom();
|
unless(quiet) showRoom();
|
||||||
return place;
|
return place;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return placeRequest(where,
|
return placeRequest(where,
|
||||||
#ifdef SPEC
|
#ifdef SPEC
|
||||||
|
Loading…
Reference in New Issue
Block a user