Do not use XEP-0012 anymore to know idle time. Use XEP-0319
This commit is contained in:
parent
9d6e3f4323
commit
28917aaf56
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.18.3 -->
|
<!-- Generated with glade 3.20.0 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.12"/>
|
<requires lib="gtk+" version="3.12"/>
|
||||||
<object class="GtkGrid" id="tooltip_grid">
|
<object class="GtkGrid" id="tooltip_grid">
|
||||||
|
@ -14,7 +14,6 @@
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<property name="use_markup">True</property>
|
<property name="use_markup">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -29,8 +28,6 @@
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Jabber ID:</property>
|
<property name="label" translatable="yes">Jabber ID:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -41,13 +38,12 @@
|
||||||
<object class="GtkImage" id="avatar">
|
<object class="GtkImage" id="avatar">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="stock">gtk-missing-image</property>
|
<property name="stock">gtk-missing-image</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">2</property>
|
<property name="left_attach">2</property>
|
||||||
<property name="top_attach">0</property>
|
<property name="top_attach">0</property>
|
||||||
<property name="height">14</property>
|
<property name="height">13</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
@ -55,9 +51,8 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Resource:</property>
|
<property name="label" translatable="yes">Resource:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -70,8 +65,6 @@
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
<property name="valign">start</property>
|
<property name="valign">start</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -83,9 +76,9 @@
|
||||||
<object class="GtkLabel" id="resource">
|
<object class="GtkLabel" id="resource">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -96,9 +89,9 @@
|
||||||
<object class="GtkLabel" id="jid">
|
<object class="GtkLabel" id="jid">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="weight" value="bold"/>
|
<attribute name="weight" value="bold"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
|
@ -117,8 +110,6 @@
|
||||||
<property name="label" translatable="yes">Status:</property>
|
<property name="label" translatable="yes">Status:</property>
|
||||||
<property name="wrap">True</property>
|
<property name="wrap">True</property>
|
||||||
<property name="max_width_chars">40</property>
|
<property name="max_width_chars">40</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -130,63 +121,34 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Idle since:</property>
|
<property name="label" translatable="yes">Idle since:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
<property name="top_attach">12</property>
|
<property name="top_attach">12</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="idle_for_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">start</property>
|
|
||||||
<property name="label" translatable="yes">Idle for:</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">0</property>
|
|
||||||
<property name="top_attach">13</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="idle_since">
|
<object class="GtkLabel" id="idle_since">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
<property name="top_attach">12</property>
|
<property name="top_attach">12</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="idle_for">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="hexpand">True</property>
|
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">1</property>
|
|
||||||
<property name="top_attach">13</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="mood_label">
|
<object class="GtkLabel" id="mood_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Mood:</property>
|
<property name="label" translatable="yes">Mood:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -198,10 +160,9 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Activity:</property>
|
<property name="label" translatable="yes">Activity:</property>
|
||||||
<property name="lines">2</property>
|
<property name="lines">2</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -213,9 +174,8 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Tune:</property>
|
<property name="label" translatable="yes">Tune:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -227,9 +187,8 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Location:</property>
|
<property name="label" translatable="yes">Location:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -240,9 +199,9 @@
|
||||||
<object class="GtkLabel" id="mood">
|
<object class="GtkLabel" id="mood">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -253,9 +212,8 @@
|
||||||
<object class="GtkLabel" id="activity">
|
<object class="GtkLabel" id="activity">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -266,9 +224,9 @@
|
||||||
<object class="GtkLabel" id="tune">
|
<object class="GtkLabel" id="tune">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -279,9 +237,9 @@
|
||||||
<object class="GtkLabel" id="location">
|
<object class="GtkLabel" id="location">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -293,9 +251,8 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">OpenPGP:</property>
|
<property name="label" translatable="yes">OpenPGP:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -306,9 +263,9 @@
|
||||||
<object class="GtkLabel" id="pgp">
|
<object class="GtkLabel" id="pgp">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -320,9 +277,8 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="halign">start</property>
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="label" translatable="yes">Subscription:</property>
|
<property name="label" translatable="yes">Subscription:</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">0</property>
|
<property name="left_attach">0</property>
|
||||||
|
@ -333,9 +289,9 @@
|
||||||
<object class="GtkLabel" id="sub">
|
<object class="GtkLabel" id="sub">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
@ -346,11 +302,11 @@
|
||||||
<object class="GtkLabel" id="status">
|
<object class="GtkLabel" id="status">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="valign">start</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="wrap">True</property>
|
<property name="wrap">True</property>
|
||||||
<property name="max_width_chars">30</property>
|
<property name="max_width_chars">30</property>
|
||||||
<property name="xalign">0</property>
|
|
||||||
<property name="yalign">0</property>
|
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="style" value="italic"/>
|
<attribute name="style" value="italic"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
|
|
|
@ -293,7 +293,6 @@ class Config:
|
||||||
'attach_notifications_to_systray': [opt_bool, False, _('If True, notification windows from notification-daemon will be attached to notification icon.')],
|
'attach_notifications_to_systray': [opt_bool, False, _('If True, notification windows from notification-daemon will be attached to notification icon.')],
|
||||||
'check_idle_every_foo_seconds': [opt_int, 2, _('Choose interval between 2 checks of idleness.')],
|
'check_idle_every_foo_seconds': [opt_int, 2, _('Choose interval between 2 checks of idleness.')],
|
||||||
'uri_schemes': [opt_str, 'aaa:// aaas:// acap:// cap:// cid: crid:// data: dav: dict:// dns: fax: file:/ ftp:// geo: go: gopher:// h323: http:// https:// iax: icap:// im: imap:// info: ipp:// iris: iris.beep: iris.xpc: iris.xpcs: iris.lwz: ldap:// mid: modem: msrp:// msrps:// mtqp:// mupdate:// news: nfs:// nntp:// opaquelocktoken: pop:// pres: prospero:// rtsp:// service: shttp:// sip: sips: sms: snmp:// soap.beep:// soap.beeps:// tag: tel: telnet:// tftp:// thismessage:/ tip:// tv: urn:// vemmi:// xmlrpc.beep:// xmlrpc.beeps:// z39.50r:// z39.50s:// about: apt: cvs:// daap:// ed2k:// feed: fish:// git:// iax2: irc:// ircs:// ldaps:// magnet: mms:// rsync:// ssh:// svn:// sftp:// smb:// webcal:// aesgcm://', _('Valid uri schemes. Only schemes in this list will be accepted as "real" uri. (mailto and xmpp are handled separately)'), True],
|
'uri_schemes': [opt_str, 'aaa:// aaas:// acap:// cap:// cid: crid:// data: dav: dict:// dns: fax: file:/ ftp:// geo: go: gopher:// h323: http:// https:// iax: icap:// im: imap:// info: ipp:// iris: iris.beep: iris.xpc: iris.xpcs: iris.lwz: ldap:// mid: modem: msrp:// msrps:// mtqp:// mupdate:// news: nfs:// nntp:// opaquelocktoken: pop:// pres: prospero:// rtsp:// service: shttp:// sip: sips: sms: snmp:// soap.beep:// soap.beeps:// tag: tel: telnet:// tftp:// thismessage:/ tip:// tv: urn:// vemmi:// xmlrpc.beep:// xmlrpc.beeps:// z39.50r:// z39.50s:// about: apt: cvs:// daap:// ed2k:// feed: fish:// git:// iax2: irc:// ircs:// ldaps:// magnet: mms:// rsync:// ssh:// svn:// sftp:// smb:// webcal:// aesgcm://', _('Valid uri schemes. Only schemes in this list will be accepted as "real" uri. (mailto and xmpp are handled separately)'), True],
|
||||||
'ask_offline_status_on_connection': [ opt_bool, False, _('Request offline status messages from all contacts upon connecting. WARNING: This causes a lot of requests to be sent!') ],
|
|
||||||
'shell_like_completion': [ opt_bool, False, _('If True, completion in groupchats will be like a shell auto-completion')],
|
'shell_like_completion': [ opt_bool, False, _('If True, completion in groupchats will be like a shell auto-completion')],
|
||||||
'show_self_contact': [opt_str, 'when_other_resource', _('When is self contact row displayed. Can be "always", "when_other_resource" or "never"'), True],
|
'show_self_contact': [opt_str, 'when_other_resource', _('When is self contact row displayed. Can be "always", "when_other_resource" or "never"'), True],
|
||||||
'audio_input_device': [opt_str, 'autoaudiosrc ! volume name=gajim_vol'],
|
'audio_input_device': [opt_str, 'autoaudiosrc ! volume name=gajim_vol'],
|
||||||
|
|
|
@ -510,24 +510,6 @@ class CommonConnection:
|
||||||
def account_changed(self, new_name):
|
def account_changed(self, new_name):
|
||||||
self.name = new_name
|
self.name = new_name
|
||||||
|
|
||||||
def request_last_status_time(self, jid, resource, groupchat_jid=None):
|
|
||||||
"""
|
|
||||||
groupchat_jid is used when we want to send a request to a real jid and
|
|
||||||
act as if the answer comes from the groupchat_jid
|
|
||||||
"""
|
|
||||||
if not gajim.account_is_connected(self.name):
|
|
||||||
return
|
|
||||||
to_whom_jid = jid
|
|
||||||
if resource:
|
|
||||||
to_whom_jid += '/' + resource
|
|
||||||
iq = nbxmpp.Iq(to=to_whom_jid, typ='get', queryNS=nbxmpp.NS_LAST)
|
|
||||||
id_ = self.connection.getAnID()
|
|
||||||
iq.setID(id_)
|
|
||||||
if groupchat_jid:
|
|
||||||
self.groupchat_jids[id_] = groupchat_jid
|
|
||||||
self.last_ids.append(id_)
|
|
||||||
self.connection.send(iq)
|
|
||||||
|
|
||||||
def request_os_info(self, jid, resource):
|
def request_os_info(self, jid, resource):
|
||||||
"""
|
"""
|
||||||
To be implemented by derivated classes
|
To be implemented by derivated classes
|
||||||
|
@ -649,11 +631,18 @@ class CommonConnection:
|
||||||
return -1
|
return -1
|
||||||
was_invisible = self.connected == gajim.SHOW_LIST.index('invisible')
|
was_invisible = self.connected == gajim.SHOW_LIST.index('invisible')
|
||||||
self.connected = gajim.SHOW_LIST.index(show)
|
self.connected = gajim.SHOW_LIST.index(show)
|
||||||
|
idle_time = None
|
||||||
|
if auto:
|
||||||
|
global HAS_IDLE
|
||||||
|
if HAS_IDLE and gajim.config.get('autoaway'):
|
||||||
|
idle_sec = int(self.sleeper.getIdleSec())
|
||||||
|
idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
||||||
|
time.gmtime(time.time() - idle_sec))
|
||||||
gajim.nec.push_incoming_event(BeforeChangeShowEvent(None,
|
gajim.nec.push_incoming_event(BeforeChangeShowEvent(None,
|
||||||
conn=self, show=show, message=msg))
|
conn=self, show=show, message=msg))
|
||||||
if was_invisible:
|
if was_invisible:
|
||||||
self._change_from_invisible()
|
self._change_from_invisible()
|
||||||
self._update_status(show, msg)
|
self._update_status(show, msg, idle_time=idle_time)
|
||||||
|
|
||||||
class Connection(CommonConnection, ConnectionHandlers):
|
class Connection(CommonConnection, ConnectionHandlers):
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
|
@ -2027,7 +2016,7 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
if self.privacy_rules_supported:
|
if self.privacy_rules_supported:
|
||||||
self.set_active_list('')
|
self.set_active_list('')
|
||||||
|
|
||||||
def _update_status(self, show, msg):
|
def _update_status(self, show, msg, idle_time=None):
|
||||||
xmpp_show = helpers.get_xmpp_show(show)
|
xmpp_show = helpers.get_xmpp_show(show)
|
||||||
priority = gajim.get_priority(self.name, xmpp_show)
|
priority = gajim.get_priority(self.name, xmpp_show)
|
||||||
p = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show)
|
p = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show)
|
||||||
|
@ -2037,6 +2026,9 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
signed = self.get_signed_presence(msg)
|
signed = self.get_signed_presence(msg)
|
||||||
if signed:
|
if signed:
|
||||||
p.setTag(nbxmpp.NS_SIGNED + ' x').setData(signed)
|
p.setTag(nbxmpp.NS_SIGNED + ' x').setData(signed)
|
||||||
|
if idle_time:
|
||||||
|
idle = p.setTag('idle', namespace=nbxmpp.NS_IDLE)
|
||||||
|
idle.setAttr('since', idle_time)
|
||||||
if self.connection:
|
if self.connection:
|
||||||
self.connection.send(p)
|
self.connection.send(p)
|
||||||
self.priority = priority
|
self.priority = priority
|
||||||
|
@ -2705,7 +2697,7 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
destroy.setAttr('jid', jid)
|
destroy.setAttr('jid', jid)
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
|
|
||||||
def send_gc_status(self, nick, jid, show, status):
|
def send_gc_status(self, nick, jid, show, status, auto=False):
|
||||||
if not gajim.account_is_connected(self.name):
|
if not gajim.account_is_connected(self.name):
|
||||||
return
|
return
|
||||||
if show == 'invisible':
|
if show == 'invisible':
|
||||||
|
@ -2724,6 +2716,14 @@ class Connection(CommonConnection, ConnectionHandlers):
|
||||||
if gajim.config.get('send_sha_in_gc_presence') and show != 'offline':
|
if gajim.config.get('send_sha_in_gc_presence') and show != 'offline':
|
||||||
p = self.add_sha(p, ptype != 'unavailable')
|
p = self.add_sha(p, ptype != 'unavailable')
|
||||||
self.add_lang(p)
|
self.add_lang(p)
|
||||||
|
if auto:
|
||||||
|
global HAS_IDLE
|
||||||
|
if HAS_IDLE and gajim.config.get('autoaway'):
|
||||||
|
idle_sec = int(self.sleeper.getIdleSec())
|
||||||
|
idle_time = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
||||||
|
time.gmtime(time.time() - idle_sec))
|
||||||
|
idle = p.setTag('idle', namespace=nbxmpp.NS_IDLE)
|
||||||
|
idle.setAttr('since', idle_time)
|
||||||
# send instantly so when we go offline, status is sent to gc before we
|
# send instantly so when we go offline, status is sent to gc before we
|
||||||
# disconnect from jabber server
|
# disconnect from jabber server
|
||||||
self.connection.send(p)
|
self.connection.send(p)
|
||||||
|
|
|
@ -874,8 +874,6 @@ class ConnectionHandlersBase:
|
||||||
# keep the jids we auto added (transports contacts) to not send the
|
# keep the jids we auto added (transports contacts) to not send the
|
||||||
# SUBSCRIBED event to gui
|
# SUBSCRIBED event to gui
|
||||||
self.automatically_added = []
|
self.automatically_added = []
|
||||||
# IDs of jabber:iq:last requests
|
|
||||||
self.last_ids = []
|
|
||||||
|
|
||||||
# keep track of sessions this connection has with other JIDs
|
# keep track of sessions this connection has with other JIDs
|
||||||
self.sessions = {}
|
self.sessions = {}
|
||||||
|
@ -918,10 +916,6 @@ class ConnectionHandlersBase:
|
||||||
def _nec_iq_error_received(self, obj):
|
def _nec_iq_error_received(self, obj):
|
||||||
if obj.conn.name != self.name:
|
if obj.conn.name != self.name:
|
||||||
return
|
return
|
||||||
if obj.id_ in self.last_ids:
|
|
||||||
gajim.nec.push_incoming_event(LastResultReceivedEvent(None,
|
|
||||||
conn=self, stanza=obj.stanza))
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _nec_presence_received(self, obj):
|
def _nec_presence_received(self, obj):
|
||||||
account = obj.conn.name
|
account = obj.conn.name
|
||||||
|
@ -972,7 +966,8 @@ class ConnectionHandlersBase:
|
||||||
obj.need_redraw = True
|
obj.need_redraw = True
|
||||||
|
|
||||||
if obj.old_show == obj.new_show and obj.contact.status == \
|
if obj.old_show == obj.new_show and obj.contact.status == \
|
||||||
obj.status and obj.contact.priority == obj.prio: # no change
|
obj.status and obj.contact.priority == obj.prio and \
|
||||||
|
obj.contact.idle_time = obj.idle_time: # no change
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
obj.contact = gajim.contacts.get_first_contact_from_jid(account,
|
obj.contact = gajim.contacts.get_first_contact_from_jid(account,
|
||||||
|
@ -1029,12 +1024,8 @@ class ConnectionHandlersBase:
|
||||||
else:
|
else:
|
||||||
# Do not override assigned key
|
# Do not override assigned key
|
||||||
obj.contact.keyID = obj.keyID
|
obj.contact.keyID = obj.keyID
|
||||||
if obj.timestamp:
|
|
||||||
obj.contact.last_status_time = localtime(obj.timestamp)
|
|
||||||
elif not gajim.block_signed_in_notifications[account]:
|
|
||||||
# We're connected since more that 30 seconds
|
|
||||||
obj.contact.last_status_time = localtime()
|
|
||||||
obj.contact.contact_nickname = obj.contact_nickname
|
obj.contact.contact_nickname = obj.contact_nickname
|
||||||
|
obj.contact.idle_time = obj.idle_time
|
||||||
|
|
||||||
if gajim.jid_is_transport(jid):
|
if gajim.jid_is_transport(jid):
|
||||||
return
|
return
|
||||||
|
@ -1178,11 +1169,6 @@ class ConnectionHandlersBase:
|
||||||
fjid=frm, error_code=msg.getErrorCode(), error_msg=error_msg,
|
fjid=frm, error_code=msg.getErrorCode(), error_msg=error_msg,
|
||||||
msg=msgtxt, time_=tim, session=session, stanza=msg))
|
msg=msgtxt, time_=tim, session=session, stanza=msg))
|
||||||
|
|
||||||
def _LastResultCB(self, con, iq_obj):
|
|
||||||
log.debug('LastResultCB')
|
|
||||||
gajim.nec.push_incoming_event(LastResultReceivedEvent(None, conn=self,
|
|
||||||
stanza=iq_obj))
|
|
||||||
|
|
||||||
def get_sessions(self, jid):
|
def get_sessions(self, jid):
|
||||||
"""
|
"""
|
||||||
Get all sessions for the given full jid
|
Get all sessions for the given full jid
|
||||||
|
@ -2246,7 +2232,6 @@ ConnectionHandlersBase, ConnectionJingle, ConnectionIBBytestream):
|
||||||
con.RegisterHandler('iq', self._TimeRevisedCB, 'get',
|
con.RegisterHandler('iq', self._TimeRevisedCB, 'get',
|
||||||
nbxmpp.NS_TIME_REVISED)
|
nbxmpp.NS_TIME_REVISED)
|
||||||
con.RegisterHandler('iq', self._LastCB, 'get', nbxmpp.NS_LAST)
|
con.RegisterHandler('iq', self._LastCB, 'get', nbxmpp.NS_LAST)
|
||||||
con.RegisterHandler('iq', self._LastResultCB, 'result', nbxmpp.NS_LAST)
|
|
||||||
con.RegisterHandler('iq', self._VersionResultCB, 'result',
|
con.RegisterHandler('iq', self._VersionResultCB, 'result',
|
||||||
nbxmpp.NS_VERSION)
|
nbxmpp.NS_VERSION)
|
||||||
con.RegisterHandler('iq', self._TimeRevisedResultCB, 'result',
|
con.RegisterHandler('iq', self._TimeRevisedResultCB, 'result',
|
||||||
|
|
|
@ -138,34 +138,6 @@ class HttpAuthReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
self.msg = self.stanza.getTagData('body')
|
self.msg = self.stanza.getTagData('body')
|
||||||
return True
|
return True
|
||||||
|
|
||||||
class LastResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
|
||||||
name = 'last-result-received'
|
|
||||||
base_network_events = []
|
|
||||||
|
|
||||||
def generate(self):
|
|
||||||
self.get_id()
|
|
||||||
self.get_jid_resource(check_fake_jid=True)
|
|
||||||
if self.id_ in self.conn.last_ids:
|
|
||||||
self.conn.last_ids.remove(self.id_)
|
|
||||||
|
|
||||||
self.status = ''
|
|
||||||
self.seconds = -1
|
|
||||||
|
|
||||||
if self.stanza.getType() == 'error':
|
|
||||||
return True
|
|
||||||
|
|
||||||
qp = self.stanza.getTag('query')
|
|
||||||
if not qp:
|
|
||||||
return
|
|
||||||
sec = qp.getAttr('seconds')
|
|
||||||
self.status = qp.getData()
|
|
||||||
try:
|
|
||||||
self.seconds = int(sec)
|
|
||||||
except Exception:
|
|
||||||
return
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
class VersionResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
class VersionResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
|
||||||
name = 'version-result-received'
|
name = 'version-result-received'
|
||||||
base_network_events = []
|
base_network_events = []
|
||||||
|
@ -825,6 +797,13 @@ PresenceHelperEvent):
|
||||||
delay_tag = self.stanza.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
delay_tag = self.stanza.getTag('delay', namespace=nbxmpp.NS_DELAY2)
|
||||||
if delay_tag:
|
if delay_tag:
|
||||||
self._generate_timestamp(self.stanza.getTimestamp2())
|
self._generate_timestamp(self.stanza.getTimestamp2())
|
||||||
|
# XEP-0319
|
||||||
|
self.idle_time = None
|
||||||
|
idle_tag = self.stanza.getTag('idle', namespace=nbxmpp.NS_IDLE)
|
||||||
|
if idle_tag:
|
||||||
|
time_str = idle_tag.getAttr('since')
|
||||||
|
tim = helpers.datetime_tuple(time_str)
|
||||||
|
self.idle_time = timegm(tim)
|
||||||
xtags = self.stanza.getTags('x')
|
xtags = self.stanza.getTags('x')
|
||||||
for x in xtags:
|
for x in xtags:
|
||||||
namespace = x.getNamespace()
|
namespace = x.getNamespace()
|
||||||
|
|
|
@ -94,8 +94,7 @@ class Contact(CommonContact):
|
||||||
"""
|
"""
|
||||||
def __init__(self, jid, account, name='', groups=None, show='', status='',
|
def __init__(self, jid, account, name='', groups=None, show='', status='',
|
||||||
sub='', ask='', resource='', priority=0, keyID='', client_caps=None,
|
sub='', ask='', resource='', priority=0, keyID='', client_caps=None,
|
||||||
our_chatstate=None, chatstate=None, last_status_time=None, msg_log_id=None,
|
our_chatstate=None, chatstate=None, idle_time=None, msg_log_id=None):
|
||||||
last_activity_time=None):
|
|
||||||
if not isinstance(jid, str):
|
if not isinstance(jid, str):
|
||||||
print('no str')
|
print('no str')
|
||||||
if groups is None:
|
if groups is None:
|
||||||
|
@ -113,8 +112,7 @@ class Contact(CommonContact):
|
||||||
self.priority = priority
|
self.priority = priority
|
||||||
self.keyID = keyID
|
self.keyID = keyID
|
||||||
self.msg_log_id = msg_log_id
|
self.msg_log_id = msg_log_id
|
||||||
self.last_status_time = last_status_time
|
self.idle_time = idle_time
|
||||||
self.last_activity_time = last_activity_time
|
|
||||||
|
|
||||||
self.pep = {}
|
self.pep = {}
|
||||||
|
|
||||||
|
@ -248,8 +246,7 @@ class LegacyContactsAPI:
|
||||||
|
|
||||||
def create_contact(self, jid, account, name='', groups=None, show='',
|
def create_contact(self, jid, account, name='', groups=None, show='',
|
||||||
status='', sub='', ask='', resource='', priority=0, keyID='',
|
status='', sub='', ask='', resource='', priority=0, keyID='',
|
||||||
client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None,
|
client_caps=None, our_chatstate=None, chatstate=None, idle_time=None):
|
||||||
last_activity_time=None):
|
|
||||||
if groups is None:
|
if groups is None:
|
||||||
groups = []
|
groups = []
|
||||||
# Use Account object if available
|
# Use Account object if available
|
||||||
|
@ -258,8 +255,7 @@ class LegacyContactsAPI:
|
||||||
show=show, status=status, sub=sub, ask=ask, resource=resource,
|
show=show, status=status, sub=sub, ask=ask, resource=resource,
|
||||||
priority=priority, keyID=keyID, client_caps=client_caps,
|
priority=priority, keyID=keyID, client_caps=client_caps,
|
||||||
our_chatstate=our_chatstate, chatstate=chatstate,
|
our_chatstate=our_chatstate, chatstate=chatstate,
|
||||||
last_status_time=last_status_time,
|
idle_time=idle_time)
|
||||||
last_activity_time=last_activity_time)
|
|
||||||
|
|
||||||
def create_self_contact(self, jid, account, resource, show, status, priority,
|
def create_self_contact(self, jid, account, resource, show, status, priority,
|
||||||
name='', keyID=''):
|
name='', keyID=''):
|
||||||
|
@ -288,8 +284,7 @@ class LegacyContactsAPI:
|
||||||
resource=contact.resource, priority=contact.priority,
|
resource=contact.resource, priority=contact.priority,
|
||||||
keyID=contact.keyID, client_caps=contact.client_caps,
|
keyID=contact.keyID, client_caps=contact.client_caps,
|
||||||
our_chatstate=contact.our_chatstate, chatstate=contact.chatstate,
|
our_chatstate=contact.our_chatstate, chatstate=contact.chatstate,
|
||||||
last_status_time=contact.last_status_time,
|
idle_time=contact.idle_time)
|
||||||
last_activity_time=contact.last_activity_time)
|
|
||||||
|
|
||||||
def add_contact(self, account, contact):
|
def add_contact(self, account, contact):
|
||||||
if account not in self._accounts:
|
if account not in self._accounts:
|
||||||
|
|
|
@ -568,30 +568,6 @@ class Interface:
|
||||||
if obj.conn.name in self.show_vcard_when_connect:
|
if obj.conn.name in self.show_vcard_when_connect:
|
||||||
self.show_vcard_when_connect.remove(obj.conn.name)
|
self.show_vcard_when_connect.remove(obj.conn.name)
|
||||||
|
|
||||||
def handle_event_last_status_time(self, obj):
|
|
||||||
# ('LAST_STATUS_TIME', account, (jid, resource, seconds, status))
|
|
||||||
account = obj.conn.name
|
|
||||||
c = gajim.contacts.get_contact(account, obj.jid, obj.resource)
|
|
||||||
tooltip_window = self.roster.tree.get_tooltip_window()
|
|
||||||
if obj.seconds < 0:
|
|
||||||
if tooltip_window:
|
|
||||||
tooltip_window.update_last_time(c, True)
|
|
||||||
return
|
|
||||||
|
|
||||||
if c: # c can be none if it's a gc contact
|
|
||||||
if obj.status:
|
|
||||||
c.status = obj.status
|
|
||||||
self.roster.draw_contact(c.jid, account) # draw offline status
|
|
||||||
last_time = time.localtime(time.time() - obj.seconds)
|
|
||||||
if c.show == 'offline':
|
|
||||||
c.last_status_time = last_time
|
|
||||||
else:
|
|
||||||
c.last_activity_time = last_time
|
|
||||||
|
|
||||||
# Set last time on roster tooltip
|
|
||||||
if tooltip_window:
|
|
||||||
tooltip_window.update_last_time(c)
|
|
||||||
|
|
||||||
def handle_event_gc_config(self, obj):
|
def handle_event_gc_config(self, obj):
|
||||||
#('GC_CONFIG', account, (jid, form_node)) config is a dict
|
#('GC_CONFIG', account, (jid, form_node)) config is a dict
|
||||||
account = obj.conn.name
|
account = obj.conn.name
|
||||||
|
@ -1148,12 +1124,6 @@ class Interface:
|
||||||
notify.popup(event_type, jid, account, msg_type, path_to_image=path,
|
notify.popup(event_type, jid, account, msg_type, path_to_image=path,
|
||||||
title=event_type, text=txt)
|
title=event_type, text=txt)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def ask_offline_status(account):
|
|
||||||
for contact in gajim.contacts.iter_contacts(account):
|
|
||||||
gajim.connections[account].request_last_status_time(contact.jid,
|
|
||||||
contact.resource)
|
|
||||||
|
|
||||||
def handle_event_signed_in(self, obj):
|
def handle_event_signed_in(self, obj):
|
||||||
"""
|
"""
|
||||||
SIGNED_IN event is emitted when we sign in, so handle it
|
SIGNED_IN event is emitted when we sign in, so handle it
|
||||||
|
@ -1164,10 +1134,6 @@ class Interface:
|
||||||
gajim.block_signed_in_notifications[account] = True
|
gajim.block_signed_in_notifications[account] = True
|
||||||
state = self.sleeper.getState()
|
state = self.sleeper.getState()
|
||||||
connected = obj.conn.connected
|
connected = obj.conn.connected
|
||||||
if gajim.config.get('ask_offline_status_on_connection'):
|
|
||||||
# Ask offline status in 1 minute so w'are sure we got all online
|
|
||||||
# presences
|
|
||||||
GLib.timeout_add_seconds(60, self.ask_offline_status, account)
|
|
||||||
if state != sleepy.STATE_UNKNOWN and connected in (2, 3):
|
if state != sleepy.STATE_UNKNOWN and connected in (2, 3):
|
||||||
# we go online or free for chat, so we activate auto status
|
# we go online or free for chat, so we activate auto status
|
||||||
gajim.sleeper_state[account] = 'online'
|
gajim.sleeper_state[account] = 'online'
|
||||||
|
@ -1608,7 +1574,6 @@ class Interface:
|
||||||
'jingle-error-received': [self.handle_event_jingle_error],
|
'jingle-error-received': [self.handle_event_jingle_error],
|
||||||
'jingle-request-received': [self.handle_event_jingle_incoming],
|
'jingle-request-received': [self.handle_event_jingle_incoming],
|
||||||
'jingleFT-cancelled-received': [self.handle_event_jingleft_cancel],
|
'jingleFT-cancelled-received': [self.handle_event_jingleft_cancel],
|
||||||
'last-result-received': [self.handle_event_last_status_time],
|
|
||||||
'message-error': [self.handle_event_msgerror],
|
'message-error': [self.handle_event_msgerror],
|
||||||
'message-not-sent': [self.handle_event_msgnotsent],
|
'message-not-sent': [self.handle_event_msgnotsent],
|
||||||
'message-sent': [self.handle_event_msgsent],
|
'message-sent': [self.handle_event_msgsent],
|
||||||
|
@ -2282,33 +2247,47 @@ class Interface:
|
||||||
if account not in gajim.sleeper_state or \
|
if account not in gajim.sleeper_state or \
|
||||||
not gajim.sleeper_state[account]:
|
not gajim.sleeper_state[account]:
|
||||||
continue
|
continue
|
||||||
if state == sleepy.STATE_AWAKE and \
|
if state == sleepy.STATE_AWAKE:
|
||||||
gajim.sleeper_state[account] in ('autoaway', 'autoxa'):
|
if gajim.sleeper_state[account] in ('autoaway', 'autoxa'):
|
||||||
# we go online
|
# we go online
|
||||||
self.roster.send_status(account, 'online',
|
self.roster.send_status(account, 'online',
|
||||||
gajim.status_before_autoaway[account])
|
gajim.status_before_autoaway[account])
|
||||||
gajim.status_before_autoaway[account] = ''
|
gajim.status_before_autoaway[account] = ''
|
||||||
gajim.sleeper_state[account] = 'online'
|
gajim.sleeper_state[account] = 'online'
|
||||||
elif state == sleepy.STATE_AWAY and \
|
if gajim.sleeper_state[account] == 'idle':
|
||||||
gajim.sleeper_state[account] == 'online' and \
|
# we go to the previous state
|
||||||
gajim.config.get('autoaway'):
|
connected = gajim.connections[account].connected
|
||||||
# we save out online status
|
self.roster.send_status(account, gajim.SHOW_LIST[connected],
|
||||||
gajim.status_before_autoaway[account] = \
|
gajim.status_before_autoaway[account])
|
||||||
|
gajim.status_before_autoaway[account] = ''
|
||||||
|
gajim.sleeper_state[account] = 'off'
|
||||||
|
elif state == sleepy.STATE_AWAY and gajim.config.get('autoaway'):
|
||||||
|
if gajim.sleeper_state[account] == 'online':
|
||||||
|
# we save out online status
|
||||||
|
gajim.status_before_autoaway[account] = \
|
||||||
gajim.connections[account].status
|
gajim.connections[account].status
|
||||||
# we go away (no auto status) [we pass True to auto param]
|
# we go away (no auto status) [we pass True to auto param]
|
||||||
auto_message = gajim.config.get('autoaway_message')
|
auto_message = gajim.config.get('autoaway_message')
|
||||||
if not auto_message:
|
if not auto_message:
|
||||||
auto_message = gajim.connections[account].status
|
auto_message = gajim.connections[account].status
|
||||||
else:
|
else:
|
||||||
auto_message = auto_message.replace('$S', '%(status)s')
|
auto_message = auto_message.replace('$S', '%(status)s')
|
||||||
auto_message = auto_message.replace('$T', '%(time)s')
|
auto_message = auto_message.replace('$T', '%(time)s')
|
||||||
auto_message = auto_message % {
|
auto_message = auto_message % {
|
||||||
'status': gajim.status_before_autoaway[account],
|
'status': gajim.status_before_autoaway[account],
|
||||||
'time': gajim.config.get('autoawaytime')
|
'time': gajim.config.get('autoawaytime')
|
||||||
}
|
}
|
||||||
self.roster.send_status(account, 'away', auto_message,
|
self.roster.send_status(account, 'away', auto_message,
|
||||||
auto=True)
|
auto=True)
|
||||||
gajim.sleeper_state[account] = 'autoaway'
|
gajim.sleeper_state[account] = 'autoaway'
|
||||||
|
elif gajim.sleeper_state[account] == 'off':
|
||||||
|
# we save out online status
|
||||||
|
gajim.status_before_autoaway[account] = \
|
||||||
|
gajim.connections[account].status
|
||||||
|
connected = gajim.connections[account].connected
|
||||||
|
self.roster.send_status(account, gajim.SHOW_LIST[connected],
|
||||||
|
gajim.status_before_autoaway[account], auto=True)
|
||||||
|
gajim.sleeper_state[account] = 'idle'
|
||||||
elif state == sleepy.STATE_XA and \
|
elif state == sleepy.STATE_XA and \
|
||||||
gajim.sleeper_state[account] in ('online', 'autoaway',
|
gajim.sleeper_state[account] in ('online', 'autoaway',
|
||||||
'autoaway-forced') and gajim.config.get('autoxa'):
|
'autoaway-forced') and gajim.config.get('autoxa'):
|
||||||
|
|
|
@ -107,8 +107,6 @@ class Remote:
|
||||||
bus_name = dbus.service.BusName(SERVICE, bus=session_bus)
|
bus_name = dbus.service.BusName(SERVICE, bus=session_bus)
|
||||||
self.signal_object = SignalObject(bus_name)
|
self.signal_object = SignalObject(bus_name)
|
||||||
|
|
||||||
gajim.ged.register_event_handler('last-result-received', ged.POSTGUI,
|
|
||||||
self.on_last_status_time)
|
|
||||||
gajim.ged.register_event_handler('version-result-received', ged.POSTGUI,
|
gajim.ged.register_event_handler('version-result-received', ged.POSTGUI,
|
||||||
self.on_os_info)
|
self.on_os_info)
|
||||||
gajim.ged.register_event_handler('time-result-received', ged.POSTGUI,
|
gajim.ged.register_event_handler('time-result-received', ged.POSTGUI,
|
||||||
|
@ -150,10 +148,6 @@ class Remote:
|
||||||
self.raise_signal('MessageSent', (obj.conn.name, [
|
self.raise_signal('MessageSent', (obj.conn.name, [
|
||||||
obj.jid, obj.message, obj.keyID, chatstate]))
|
obj.jid, obj.message, obj.keyID, chatstate]))
|
||||||
|
|
||||||
def on_last_status_time(self, obj):
|
|
||||||
self.raise_signal('LastStatusTime', (obj.conn.name, [
|
|
||||||
obj.jid, obj.resource, obj.seconds, obj.status]))
|
|
||||||
|
|
||||||
def on_os_info(self, obj):
|
def on_os_info(self, obj):
|
||||||
self.raise_signal('OsInfo', (obj.conn.name, [obj.jid, obj.resource,
|
self.raise_signal('OsInfo', (obj.conn.name, [obj.jid, obj.resource,
|
||||||
obj.client_info, obj.os_info]))
|
obj.client_info, obj.os_info]))
|
||||||
|
@ -278,10 +272,6 @@ class SignalObject(dbus.service.Object):
|
||||||
def VcardInfo(self, account_and_vcard):
|
def VcardInfo(self, account_and_vcard):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@dbus.service.signal(INTERFACE, signature='av')
|
|
||||||
def LastStatusTime(self, account_and_array):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@dbus.service.signal(INTERFACE, signature='av')
|
@dbus.service.signal(INTERFACE, signature='av')
|
||||||
def OsInfo(self, account_and_array):
|
def OsInfo(self, account_and_array):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -2117,9 +2117,6 @@ class RosterWindow:
|
||||||
def send_status(self, account, status, txt, auto=False, to=None):
|
def send_status(self, account, status, txt, auto=False, to=None):
|
||||||
if status != 'offline':
|
if status != 'offline':
|
||||||
if to is None:
|
if to is None:
|
||||||
if status == gajim.connections[account].get_status() and \
|
|
||||||
txt == gajim.connections[account].status:
|
|
||||||
return
|
|
||||||
gajim.config.set_per('accounts', account, 'last_status', status)
|
gajim.config.set_per('accounts', account, 'last_status', status)
|
||||||
gajim.config.set_per('accounts', account, 'last_status_msg',
|
gajim.config.set_per('accounts', account, 'last_status_msg',
|
||||||
helpers.to_one_line(txt))
|
helpers.to_one_line(txt))
|
||||||
|
@ -2194,7 +2191,8 @@ class RosterWindow:
|
||||||
if gc_control.account == account:
|
if gc_control.account == account:
|
||||||
if gajim.gc_connected[account][gc_control.room_jid]:
|
if gajim.gc_connected[account][gc_control.room_jid]:
|
||||||
gajim.connections[account].send_gc_status(
|
gajim.connections[account].send_gc_status(
|
||||||
gc_control.nick, gc_control.room_jid, status, txt)
|
gc_control.nick, gc_control.room_jid, status, txt,
|
||||||
|
auto=auto)
|
||||||
if was_invisible and status != 'offline':
|
if was_invisible and status != 'offline':
|
||||||
# We come back from invisible, join bookmarks
|
# We come back from invisible, join bookmarks
|
||||||
gajim.interface.auto_join_bookmarks(account)
|
gajim.interface.auto_join_bookmarks(account)
|
||||||
|
|
|
@ -70,7 +70,6 @@ class BaseTooltip:
|
||||||
self.win = None
|
self.win = None
|
||||||
self.id = None
|
self.id = None
|
||||||
self.cur_data = None
|
self.cur_data = None
|
||||||
self.check_last_time = None
|
|
||||||
self.shown = False
|
self.shown = False
|
||||||
self.position_computed = False
|
self.position_computed = False
|
||||||
|
|
||||||
|
@ -142,7 +141,7 @@ class BaseTooltip:
|
||||||
self.screen.get_width() + half_width:
|
self.screen.get_width() + half_width:
|
||||||
self.preferred_position[0] = self.screen.get_width() - \
|
self.preferred_position[0] = self.screen.get_width() - \
|
||||||
rect.width
|
rect.width
|
||||||
elif not self.check_last_time:
|
else:
|
||||||
self.preferred_position[0] -= half_width
|
self.preferred_position[0] -= half_width
|
||||||
self.position_computed = True
|
self.position_computed = True
|
||||||
self.win.move(self.preferred_position[0], self.preferred_position[1])
|
self.win.move(self.preferred_position[0], self.preferred_position[1])
|
||||||
|
@ -184,7 +183,6 @@ class BaseTooltip:
|
||||||
self.win = None
|
self.win = None
|
||||||
self.id = None
|
self.id = None
|
||||||
self.cur_data = None
|
self.cur_data = None
|
||||||
self.check_last_time = None
|
|
||||||
self.shown = False
|
self.shown = False
|
||||||
|
|
||||||
class StatusTable:
|
class StatusTable:
|
||||||
|
@ -230,8 +228,8 @@ class StatusTable:
|
||||||
str_status += ' - <i>' + status + '</i>'
|
str_status += ' - <i>' + status + '</i>'
|
||||||
return str_status
|
return str_status
|
||||||
|
|
||||||
def add_status_row(self, file_path, show, str_status, status_time=None,
|
def add_status_row(self, file_path, show, str_status, show_lock=False,
|
||||||
show_lock=False, indent=True):
|
indent=True):
|
||||||
"""
|
"""
|
||||||
Append a new row with status icon to the table
|
Append a new row with status icon to the table
|
||||||
"""
|
"""
|
||||||
|
@ -420,7 +418,6 @@ class RosterTooltip(Gtk.Window, StatusTable):
|
||||||
StatusTable.__init__(self)
|
StatusTable.__init__(self)
|
||||||
self.create_table()
|
self.create_table()
|
||||||
self.row = None
|
self.row = None
|
||||||
self.check_last_time = {}
|
|
||||||
self.contact_jid = None
|
self.contact_jid = None
|
||||||
self.last_widget = None
|
self.last_widget = None
|
||||||
self.num_resources = 0
|
self.num_resources = 0
|
||||||
|
@ -433,11 +430,10 @@ class RosterTooltip(Gtk.Window, StatusTable):
|
||||||
self.xml = gtkgui_helpers.get_gtk_builder('tooltip_roster_contact.ui')
|
self.xml = gtkgui_helpers.get_gtk_builder('tooltip_roster_contact.ui')
|
||||||
for name in ('name', 'status', 'jid', 'user_show', 'fillelement',
|
for name in ('name', 'status', 'jid', 'user_show', 'fillelement',
|
||||||
'resource', 'avatar', 'resource_label', 'pgp', 'pgp_label',
|
'resource', 'avatar', 'resource_label', 'pgp', 'pgp_label',
|
||||||
'jid_label', 'tooltip_grid', 'idle_since', 'idle_for',
|
'jid_label', 'tooltip_grid', 'idle_since', 'idle_since_label',
|
||||||
'idle_since_label', 'idle_for_label', 'mood', 'tune',
|
'mood', 'tune', 'activity', 'location', 'tune_label',
|
||||||
'activity', 'location', 'tune_label', 'location_label',
|
'location_label', 'activity_label', 'mood_label', 'sub_label',
|
||||||
'activity_label', 'mood_label', 'sub_label', 'sub',
|
'sub', 'status_label'):
|
||||||
'status_label'):
|
|
||||||
setattr(self, name, self.xml.get_object(name))
|
setattr(self, name, self.xml.get_object(name))
|
||||||
|
|
||||||
self.add(self.tooltip_grid)
|
self.add(self.tooltip_grid)
|
||||||
|
@ -612,8 +608,7 @@ class RosterTooltip(Gtk.Window, StatusTable):
|
||||||
|
|
||||||
status_line = self.get_status_info(acontact.resource,
|
status_line = self.get_status_info(acontact.resource,
|
||||||
acontact.priority, acontact.show, status)
|
acontact.priority, acontact.show, status)
|
||||||
self.add_status_row(file_path, icon_name, status_line,
|
self.add_status_row(file_path, icon_name, status_line)
|
||||||
acontact.last_status_time)
|
|
||||||
if add_text:
|
if add_text:
|
||||||
self.add_text_row(acontact.status, 2)
|
self.add_text_row(acontact.status, 2)
|
||||||
|
|
||||||
|
@ -621,31 +616,12 @@ class RosterTooltip(Gtk.Window, StatusTable):
|
||||||
self.table.show_all()
|
self.table.show_all()
|
||||||
|
|
||||||
else: # only one resource
|
else: # only one resource
|
||||||
if contact.show:
|
if contact.show and contact.status:
|
||||||
request_time = False
|
status = contact.status.strip()
|
||||||
try:
|
if status:
|
||||||
last_time = self.check_last_time[contact]
|
self.status.set_text(status)
|
||||||
if isinstance(last_time, float) and last_time < time.time() - 60:
|
self.status.show()
|
||||||
request_time = True
|
self.status_label.show()
|
||||||
except KeyError:
|
|
||||||
request_time = True
|
|
||||||
|
|
||||||
if request_time:
|
|
||||||
if contact.show == 'offline':
|
|
||||||
gajim.connections[account].\
|
|
||||||
request_last_status_time(contact.jid, '')
|
|
||||||
elif contact.resource:
|
|
||||||
gajim.connections[account].\
|
|
||||||
request_last_status_time(
|
|
||||||
contact.jid, contact.resource)
|
|
||||||
self.check_last_time[contact] = time.time()
|
|
||||||
|
|
||||||
if contact.status:
|
|
||||||
status = contact.status.strip()
|
|
||||||
if status:
|
|
||||||
self.status.set_text(status)
|
|
||||||
self.status.show()
|
|
||||||
self.status_label.show()
|
|
||||||
|
|
||||||
# PEP Info
|
# PEP Info
|
||||||
self._append_pep_info(contact)
|
self._append_pep_info(contact)
|
||||||
|
@ -736,51 +712,24 @@ class RosterTooltip(Gtk.Window, StatusTable):
|
||||||
self.location_label.show()
|
self.location_label.show()
|
||||||
|
|
||||||
def _set_idle_time(self, contact):
|
def _set_idle_time(self, contact):
|
||||||
if contact.last_activity_time:
|
if contact.idle_time:
|
||||||
last_active = datetime(*contact.last_activity_time[:6])
|
idle_color = gajim.config.get('tooltip_idle_color')
|
||||||
|
idle_time = contact.idle_time
|
||||||
|
idle_time = time.localtime(contact.idle_time)
|
||||||
|
idle_time = datetime(*(idle_time[:6]))
|
||||||
current = datetime.now()
|
current = datetime.now()
|
||||||
|
if idle_time.date() == current.date():
|
||||||
diff = current - last_active
|
formatted = idle_time.strftime("%X")
|
||||||
diff = timedelta(diff.days, diff.seconds)
|
|
||||||
|
|
||||||
if last_active.date() == current.date():
|
|
||||||
formatted = last_active.strftime("%X")
|
|
||||||
else:
|
else:
|
||||||
formatted = last_active.strftime("%c")
|
formatted = idle_time.strftime("%c")
|
||||||
|
idle_markup = "<span foreground='{}'>{}</span>".format(idle_color,
|
||||||
# Do not show the "Idle since" and "Idle for" items if there
|
formatted)
|
||||||
# is no meaningful difference between last activity time and
|
self.idle_since.set_markup(idle_markup)
|
||||||
# current time.
|
self.idle_since.show()
|
||||||
if diff.days > 0 or diff.seconds > 0:
|
self.idle_since_label.show()
|
||||||
idle_color = gajim.config.get('tooltip_idle_color')
|
|
||||||
idle_markup = "<span foreground='{}'>{}</span>".format(idle_color, formatted)
|
|
||||||
self.idle_since.set_markup(idle_markup)
|
|
||||||
self.idle_since.show()
|
|
||||||
self.idle_since_label.show()
|
|
||||||
idle_markup = "<span foreground='{}'>{}</span>".format(idle_color, str(diff))
|
|
||||||
self.idle_for.set_markup(idle_markup)
|
|
||||||
self.idle_for_label.show()
|
|
||||||
self.idle_for.show()
|
|
||||||
|
|
||||||
if contact.show and self.num_resources < 2:
|
if contact.show and self.num_resources < 2:
|
||||||
show = helpers.get_uf_show(contact.show)
|
show = helpers.get_uf_show(contact.show)
|
||||||
if contact.last_status_time:
|
|
||||||
if contact.show == 'offline':
|
|
||||||
text = ' - ' + _('Last status: %s')
|
|
||||||
else:
|
|
||||||
text = _(' since %s')
|
|
||||||
|
|
||||||
if time.strftime('%j', time.localtime()) == \
|
|
||||||
time.strftime('%j', contact.last_status_time):
|
|
||||||
# it's today, show only the locale hour representation
|
|
||||||
local_time = time.strftime('%X', contact.last_status_time)
|
|
||||||
else:
|
|
||||||
# time.strftime returns locale encoded string
|
|
||||||
local_time = time.strftime('%c', contact.last_status_time)
|
|
||||||
|
|
||||||
text = text % local_time
|
|
||||||
show += text
|
|
||||||
|
|
||||||
# Contact is Groupchat
|
# Contact is Groupchat
|
||||||
if (self.account and
|
if (self.account and
|
||||||
self.prim_contact.jid in gajim.gc_connected[self.account]):
|
self.prim_contact.jid in gajim.gc_connected[self.account]):
|
||||||
|
@ -805,15 +754,6 @@ class RosterTooltip(Gtk.Window, StatusTable):
|
||||||
return contact.show
|
return contact.show
|
||||||
return 'not in roster'
|
return 'not in roster'
|
||||||
|
|
||||||
def update_last_time(self, contact, error=False):
|
|
||||||
if not contact:
|
|
||||||
return
|
|
||||||
if error:
|
|
||||||
self.check_last_time[contact] = 'error'
|
|
||||||
return
|
|
||||||
if contact.jid == self.contact_jid:
|
|
||||||
self._set_idle_time(contact)
|
|
||||||
|
|
||||||
|
|
||||||
class FileTransfersTooltip(BaseTooltip):
|
class FileTransfersTooltip(BaseTooltip):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -134,8 +134,6 @@ class VcardWindow:
|
||||||
|
|
||||||
gajim.ged.register_event_handler('version-result-received', ged.GUI1,
|
gajim.ged.register_event_handler('version-result-received', ged.GUI1,
|
||||||
self.set_os_info)
|
self.set_os_info)
|
||||||
gajim.ged.register_event_handler('last-result-received', ged.GUI2,
|
|
||||||
self.set_last_status_time)
|
|
||||||
gajim.ged.register_event_handler('time-result-received', ged.GUI1,
|
gajim.ged.register_event_handler('time-result-received', ged.GUI1,
|
||||||
self.set_entity_time)
|
self.set_entity_time)
|
||||||
gajim.ged.register_event_handler('vcard-received', ged.GUI1,
|
gajim.ged.register_event_handler('vcard-received', ged.GUI1,
|
||||||
|
@ -181,8 +179,6 @@ class VcardWindow:
|
||||||
connection.store_annotations()
|
connection.store_annotations()
|
||||||
gajim.ged.remove_event_handler('version-result-received', ged.GUI1,
|
gajim.ged.remove_event_handler('version-result-received', ged.GUI1,
|
||||||
self.set_os_info)
|
self.set_os_info)
|
||||||
gajim.ged.remove_event_handler('last-result-received', ged.GUI2,
|
|
||||||
self.set_last_status_time)
|
|
||||||
gajim.ged.remove_event_handler('time-result-received', ged.GUI1,
|
gajim.ged.remove_event_handler('time-result-received', ged.GUI1,
|
||||||
self.set_entity_time)
|
self.set_entity_time)
|
||||||
gajim.ged.remove_event_handler('vcard-received', ged.GUI1,
|
gajim.ged.remove_event_handler('vcard-received', ged.GUI1,
|
||||||
|
@ -294,13 +290,6 @@ class VcardWindow:
|
||||||
self.clear_values()
|
self.clear_values()
|
||||||
self.set_values(obj.vcard_dict)
|
self.set_values(obj.vcard_dict)
|
||||||
|
|
||||||
def set_last_status_time(self, obj):
|
|
||||||
if obj.conn.name != self.account:
|
|
||||||
return
|
|
||||||
if obj.fjid != self.real_jid:
|
|
||||||
return
|
|
||||||
self.fill_status_label()
|
|
||||||
|
|
||||||
def set_os_info(self, obj):
|
def set_os_info(self, obj):
|
||||||
if obj.conn.name != self.account:
|
if obj.conn.name != self.account:
|
||||||
return
|
return
|
||||||
|
@ -387,18 +376,12 @@ class VcardWindow:
|
||||||
stats = helpers.get_uf_show(self.contact.show)
|
stats = helpers.get_uf_show(self.contact.show)
|
||||||
if self.contact.status:
|
if self.contact.status:
|
||||||
stats += ': ' + self.contact.status
|
stats += ': ' + self.contact.status
|
||||||
if self.contact.last_status_time:
|
|
||||||
stats += '\n' + _('since %s') % time.strftime('%c',
|
|
||||||
self.contact.last_status_time)
|
|
||||||
for c in connected_contact_list:
|
for c in connected_contact_list:
|
||||||
if c.resource != self.contact.resource:
|
if c.resource != self.contact.resource:
|
||||||
stats += '\n'
|
stats += '\n'
|
||||||
stats += helpers.get_uf_show(c.show)
|
stats += helpers.get_uf_show(c.show)
|
||||||
if c.status:
|
if c.status:
|
||||||
stats += ': ' + c.status
|
stats += ': ' + c.status
|
||||||
if c.last_status_time:
|
|
||||||
stats += '\n' + _('since %s') % time.strftime('%c',
|
|
||||||
c.last_status_time)
|
|
||||||
else: # Maybe gc_vcard ?
|
else: # Maybe gc_vcard ?
|
||||||
stats = helpers.get_uf_show(self.contact.show)
|
stats = helpers.get_uf_show(self.contact.show)
|
||||||
if self.contact.status:
|
if self.contact.status:
|
||||||
|
@ -452,16 +435,6 @@ class VcardWindow:
|
||||||
if not self.contact.status:
|
if not self.contact.status:
|
||||||
self.contact.status = ''
|
self.contact.status = ''
|
||||||
|
|
||||||
# Request list time status only if contact is offline
|
|
||||||
if self.contact.show == 'offline':
|
|
||||||
if self.gc_contact:
|
|
||||||
j, r = gajim.get_room_and_nick_from_fjid(self.real_jid)
|
|
||||||
gajim.connections[self.account].request_last_status_time(j, r,
|
|
||||||
self.contact.jid)
|
|
||||||
else:
|
|
||||||
gajim.connections[self.account].request_last_status_time(
|
|
||||||
self.contact.jid, '')
|
|
||||||
|
|
||||||
# do not wait for os_info if contact is not connected or has error
|
# do not wait for os_info if contact is not connected or has error
|
||||||
# additional check for observer is needed, as show is offline for him
|
# additional check for observer is needed, as show is offline for him
|
||||||
if self.contact.show in ('offline', 'error')\
|
if self.contact.show in ('offline', 'error')\
|
||||||
|
@ -599,9 +572,6 @@ class ZeroconfVcardWindow:
|
||||||
stats += helpers.get_uf_show(c.show)
|
stats += helpers.get_uf_show(c.show)
|
||||||
if c.status:
|
if c.status:
|
||||||
stats += ': ' + c.status
|
stats += ': ' + c.status
|
||||||
if c.last_status_time:
|
|
||||||
stats += '\n' + _('since %s') % time.strftime('%c',
|
|
||||||
c.last_status_time).decode(locale.getpreferredencoding())
|
|
||||||
one = False
|
one = False
|
||||||
else: # Maybe gc_vcard ?
|
else: # Maybe gc_vcard ?
|
||||||
stats = helpers.get_uf_show(self.contact.show)
|
stats = helpers.get_uf_show(self.contact.show)
|
||||||
|
|
Loading…
Reference in New Issue