Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • gajim/gajim-plugins
  • lovetox/gajim-plugins
  • ag/gajim-plugins
  • FlorianMuenchbach/gajim-plugins
  • rom1dep/gajim-plugins
  • pitchum/gajim-plugins
  • wurstsalat/gajim-plugins
  • Dicson/gajim-plugins
  • andre/gajim-plugins
  • link2xt/gajim-plugins
  • marmistrz/gajim-plugins
  • Jens/gajim-plugins
  • muelli/gajim-plugins
  • asterix/gajim-plugins
  • orhideous/gajim-plugins
  • ngvelprz/gajim-plugins
  • appleorange1/gajim-plugins
  • Martin/gajim-plugins
  • maltel/gajim-plugins
  • Seve/gajim-plugins
  • evert-mouw/gajim-plugins
  • Yuki/gajim-plugins
  • mxre/gajim-plugins
  • ValdikSS/gajim-plugins
  • SaltyBones/gajim-plugins
  • comradekingu/gajim-plugins
  • ritzmann/gajim-plugins
  • genofire/gajim-plugins
  • jjrh/gajim-plugins
  • yarmak/gajim-plugins
  • PapaTutuWawa/gajim-plugins
  • weblate/gajim-plugins
  • XutaxKamay/gajim-plugins
  • nekk/gajim-plugins
  • principis/gajim-plugins
  • cbix/gajim-plugins
  • bodqhrohro/gajim-plugins
  • airtower-luna/gajim-plugins
  • toms/gajim-plugins
  • mesonium/gajim-plugins
  • lissine/gajim-plugins
  • anviar/gajim-plugins
42 results
Show changes
Commits on Source (367)
Showing
with 580 additions and 105 deletions
......@@ -35,7 +35,6 @@ class AntiSpamPlugin(GajimPlugin):
@log_calls('AntiSpamPlugin')
def init(self):
self.description = _('Allows to block some kind of incoming messages')
self.config_dialog = AntiSpamPluginConfigDialog(self)
self.gui_extension_points = {
......@@ -45,6 +44,8 @@ class AntiSpamPlugin(GajimPlugin):
'atom-entry-received': (ged.POSTCORE,
self._nec_atom_entry_received),
'message-received': (ged.PRECORE,
self._nec_message_received_received),
'decrypted-message-received': (ged.PRECORE,
self._nec_decrypted_message_received_received),
'subscribe-presence-received': (ged.POSTCORE,
self._nec_subscribe_presence_received),
......@@ -55,6 +56,7 @@ class AntiSpamPlugin(GajimPlugin):
'disable_xhtml_muc': (False, ''),
'disable_xhtml_pm': (False, ''),
'block_subscription_requests': (False, ''),
'msgtxt_limit': (-1, ''),
}
@log_calls('AntiSpamPlugin')
......@@ -64,7 +66,7 @@ class AntiSpamPlugin(GajimPlugin):
return True
@log_calls('AntiSpamPlugin')
def _nec_decrypted_message_received_received(self, obj):
def _nec_message_received_received(self, obj):
if self.config['disable_xhtml_muc'] and obj.mtype == 'groupchat':
self.remove_xhtml(obj)
if self.config['disable_xhtml_pm'] and obj.gc_control and \
......@@ -72,6 +74,15 @@ class AntiSpamPlugin(GajimPlugin):
self.remove_xhtml(obj)
return False
@log_calls('AntiSpamPlugin')
def _nec_decrypted_message_received_received(self, obj):
if not obj.msgtxt:
return False
limit = self.config['msgtxt_limit']
if limit > -1 and len(obj.msgtxt) > limit:
return True
return False
@log_calls('AntiSpamPlugin')
def _nec_subscribe_presence_received(self, obj):
if self.config['block_subscription_requests'] and \
......@@ -110,6 +121,8 @@ class AntiSpamPluginConfigDialog(GajimPluginConfigDialog):
widget.set_active(self.plugin.config['disable_xhtml_pm'])
widget = self.xml.get_object('block_subscription_requests_checkbutton')
widget.set_active(self.plugin.config['block_subscription_requests'])
widget = self.xml.get_object('message_size_limit_entry')
widget.set_text(str(self.plugin.config['msgtxt_limit']))
def on_block_pubsub_messages_checkbutton_toggled(self, button):
self.plugin.config['block_pubsub_messages'] = button.get_active()
......@@ -122,3 +135,9 @@ class AntiSpamPluginConfigDialog(GajimPluginConfigDialog):
def on_block_subscription_requests_checkbutton_toggled(self, button):
self.plugin.config['block_subscription_requests'] = button.get_active()
def on_message_size_limit_entry_changed(self, entry):
try:
self.plugin.config['msgtxt_limit'] = int(entry.get_text())
except Exception:
pass
......@@ -3,11 +3,12 @@
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkVBox" id="anti_spam_config_vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">9</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child>
<object class="GtkCheckButton" id="block_pubsub_messages_checkbutton">
......@@ -16,11 +17,13 @@
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">If checked, Gajim will block incoming messages from pubsub.</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_block_pubsub_messages_checkbutton_toggled"/>
<signal name="toggled" handler="on_block_pubsub_messages_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
......@@ -31,11 +34,13 @@
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">If checked, Gajim will remove XHTML from incoming multi-user chat messages</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_disable_xhtml_muc_checkbutton_toggled"/>
<signal name="toggled" handler="on_disable_xhtml_muc_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
......@@ -46,11 +51,13 @@
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">If checked, Gajim will remove XHTML from incoming private messages</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_disable_xhtml_pm_checkbutton_toggled"/>
<signal name="toggled" handler="on_disable_xhtml_pm_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
......@@ -61,14 +68,52 @@
<property name="can_focus">False</property>
<property name="receives_default">False</property>
<property name="tooltip_text" translatable="yes">If checked, Gajim will block incoming subscription requests</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_block_subscription_requests_checkbutton_toggled"/>
<signal name="toggled" handler="on_block_subscription_requests_checkbutton_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Message size limit:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="message_size_limit_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="changed" handler="on_message_size_limit_entry_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
......
[info]
name: Anti Spam
short_name: anti_spam
version: 0.3
version: 0.4.1
description: Block some incoming messages.
authors = Yann Leboulanger <asterix@lagaule.org>
Denis Fomin <fominde@gmail.com>
homepage = http://trac-plugins.gajim.org/wiki/AntiSpamPlugin
max_gajim_version: 0.16.9
from plugin import AppindicatorIntegrationPlugin
[info]
name: Appindicator integration
short_name: appindicator_integration
version: 0.1.5
description: This plugin integrates Gajim with the appindicator. You must have python-appindicator (and Gajim obviously) installed to enable this plugin.<br/>
Rewriten from Ubuntu Ayatana Integration plugin
homepage: http://trac-plugins.gajim.org/wiki/AppindicatorSupportPlugin
authors: Denis Borenko <borenko@rambler.ru>
max_gajim_version: 0.16.9
# -*- coding: utf-8 -*-
"""
Appindicator integration plugin.
Rewriten from Ubuntu Ayatana Integration plugin
2013 Denis Borenko <borenko@rambler.ru>
:license: GPLv3
"""
# Python
import os
import time
import gobject
#GTK
import gtkgui_helpers
import gtk
try:
import appindicator
except:
appindicator = None
# Gajim
from common import gajim, ged
from plugins import GajimPlugin
from plugins.plugin import GajimPluginException
from plugins.helpers import log_calls
class AppindicatorIntegrationPlugin(GajimPlugin):
@log_calls("AppindicatorIntegrationPlugin")
def init(self):
self.config_dialog = None
self.test_activatable()
self.events_handlers = {'our-show': (ged.GUI2, self.set_indicator_icon)}
def test_activatable(self):
self.available_text = ''
if not appindicator:
self.activatable = False
self.available_text += _('<br/><br/> Error: python-appindicator is missing!<br/>Please install it.')
@log_calls("AppindicatorIntegrationPlugin")
def activate(self):
self.events = {}
self.attention_icon = "tray-message"
self.online_icon = "tray-online"
self.offline_icon = "tray-offline"
self.connected = 0
self.connect_menu_item = gtk.MenuItem('Connect')
self.connect_menu_item.connect("activate", self.connect)
self.show_gajim_menu_item = gtk.MenuItem('Show/hide roster')
self.show_gajim_menu_item.connect("activate", self.roster_raise)
self.show_gajim_menu_item.show()
self.event_separator = gtk.SeparatorMenuItem()
self.menuEventInsertIndex = 3
itemExitSeparator = gtk.SeparatorMenuItem()
itemExitSeparator.show()
itemExit = gtk.MenuItem('Exit')
itemExit.connect("activate", self.on_exit_menuitem_activate)
itemExit.show()
self.menu = gtk.Menu()
self.menu.append(self.connect_menu_item)
self.menu.append(self.show_gajim_menu_item)
self.menu.append(self.event_separator)
self.menu.append(itemExitSeparator)
self.menu.append(itemExit)
self.menu.show()
self.indicator = appindicator.Indicator("Gajim", self.offline_icon,
appindicator.CATEGORY_APPLICATION_STATUS)
self.indicator.set_attention_icon(self.attention_icon)
self.indicator.set_status(appindicator.STATUS_ACTIVE)
self.indicator.set_menu(self.menu)
self.set_indicator_icon()
gajim.events.event_added_subscribe(self.on_event_added)
gajim.events.event_removed_subscribe(self.on_event_removed)
def connect(self, widget, data=None):
for account in gajim.connections:
if gajim.config.get_per('accounts', account,
'sync_with_global_status'):
gajim.connections[account].change_status('online','online')
def set_indicator_icon(self, obj=''):
is_connected = 0
for account in gajim.connections:
if not gajim.config.get_per('accounts', account,
'sync_with_global_status'):
continue
if gajim.account_is_connected(account):
is_connected = 1
break
if self.connected != is_connected:
self.connected = is_connected
if self.connected == 1:
self.indicator.set_icon(self.online_icon)
self.connect_menu_item.hide()
else:
self.indicator.set_icon(self.offline_icon)
self.connect_menu_item.show()
@log_calls("AppindicatorPlugin")
def deactivate(self):
gajim.events.event_added_unsubscribe(self.on_event_added)
gajim.events.event_removed_unsubscribe(self.on_event_removed)
if hasattr(self, 'indicator'):
self.indicator.set_status(appindicator.STATUS_PASSIVE)
del self.indicator
def roster_raise(self, widget, data=None):
win = gajim.interface.roster.window
if win.is_active():
gobject.idle_add(win.hide)
else:
win.present()
# preserve the 'steal focus preservation'
#if self._is_first():
# win.window.focus(gtk.get_current_event_time())
#else:
win.window.focus(long(time.time()))
def on_exit_menuitem_activate(self, widget, data=None):
gajim.interface.roster.on_quit_request()
def event_raise(self, widget, event):
gajim.interface.handle_event(event.account, event.jid, event.type_)
win = gajim.interface.roster.window
if not win.is_active():
win.present()
def on_event_added(self, event):
account = event.account
jid = event.jid
when = time.time()
contact = ""
key = (account, jid)
if event.type_ == "chat" or \
event.type_ == "printed_chat" or \
event.type_ == "normal" or \
event.type_ == "printed_normal" or \
event.type_ == "file-request" or \
event.type_ == "jingle-incoming":
contact = gajim.contacts.get_contact_from_full_jid(account, jid)
if contact:
contact = contact.get_shown_name()
else:
contact = jid
elif event.type_ == "pm" or event.type_ == "printed_pm":
contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) + \
"/" + gajim.get_room_and_nick_from_fjid(jid)[1]
elif event.type_ == "printed_marked_gc_msg":
contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid))
else:
return
#print account, jid, when, contact
event.time = when
if key not in self.events:
icon = None
if gajim.config.get("show_avatars_in_roster"):
pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid)
if pixbuf not in (None, "ask"):
icon = gtk.Image()
icon.set_from_pixbuf(pixbuf)
else:
file_path = gtkgui_helpers.get_path_to_generic_or_avatar(jid)
if os.path.isfile(file_path):
fd = fopen(file_path, 'rb')
data = fd.read()
icon = gtk.Image()
icon.set_from_pixbuf(gtkgui_helpers.get_pixbuf_from_data(data))
item = gtk.ImageMenuItem(contact + " (1)")
if icon:
item.set_image(icon)
item.set_always_show_image(True)
item.connect("activate", self.event_raise, event)
item.show()
self.menu.insert(item, self.menuEventInsertIndex)
self.event_separator.show()
self.events[key] = {}
self.events[key]['item'] = item
self.events[key]['contact'] = contact
self.events[key]['events'] = [event]
else:
self.events[key]['events'].append(event)
item = self.events[key]['item']
item.set_label(self.events[key]['contact'] +
" (" + str(len(self.events[key]['events'])) + ")")
self.indicator.set_status(appindicator.STATUS_ATTENTION)
def on_event_removed(self, events):
for event in events:
key = (event.account, event.jid)
if key in self.events and event in self.events[key]['events']:
self.events[key]['events'].remove(event)
if len(self.events[key]['events']) == 0: # remove indicator
self.menu.remove(self.events[key]['item'])
del self.events[key]
else:
self.events[key]['item'].connect("activate",
self.event_raise, self.events[key]['events'][-1])
if len(self.events) == 0:
self.event_separator.hide()
self.indicator.set_status(appindicator.STATUS_ACTIVE)
[info]
name: Banner Tweaks
short_name: banner_tweaks
version: 0.1.1
version: 0.1.2
description: Allows user to tweak chat window banner appearance (eg. make it compact).
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://trac-plugins.gajim.org/wiki/BannerTweaksPlugin
max_gajim_version: 0.16.9
......@@ -45,10 +45,6 @@ class BannerTweaksPlugin(GajimPlugin):
@log_calls('BannerTweaksPlugin')
def init(self):
self.description = _('Allows user to tweak chat window banner '
'appearance (eg. make it compact).\n'
'Based on patch by pb in ticket #4133:\n'
'http://trac.gajim.org/attachment/ticket/4133.')
self.config_dialog = BannerTweaksPluginConfigDialog(self)
self.gui_extension_points = {
......
from plugin import BirthDayPlugin
birthday_reminder/birthday_reminder.png

813 B

birthday_reminder/birthday_reminder_large.png

6.83 KiB

[info]
name: Birthday reminder
short_name: birthday_reminder
version: 0.0.3
description: Birthday reminder plugin. Reminder before 5,3,1 and birthday days.
authors: Evgeniy Popov <evgeniypopov@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/BirthdayReminderPlugin
import os
import glob
import datetime
from xml.dom.minidom import *
import gobject
from plugins import GajimPlugin
from plugins.helpers import log_calls
from notify import popup
from common import configpaths
from common import gajim
from common import ged
class BirthDayPlugin(GajimPlugin):
@log_calls('BirthDayPlugin')
def init(self):
self.config_dialog = None
self.events_handlers = {
'roster-received': (ged.GUI2, self.roster_received)}
configpath = configpaths.ConfigPaths()
cache_path = configpath.cache_root
self.vcard_path = os.path.join(cache_path, 'vcards') + os.sep
self.timeout_id = 0
self.showed_accounts = []
def check_birthdays(self, account=None):
def show_popup(account, jid):
contact_instances = gajim.contacts.get_contacts(account, jid)
contact = gajim.contacts.get_highest_prio_contact_from_contacts(
contact_instances)
if contact:
nick = gobject.markup_escape_text(contact.get_shown_name())
try:
image = os.path.dirname(__file__) + os.sep + \
'birthday_reminder_large.png'
except:
image = None
popup('Send message', contact.jid, account, msg_type='', \
path_to_image=image, title=title, text=text + ' ' + nick)
accounts = gajim.contacts.get_accounts()
vcards = []
date_dict = {}
for jid in glob.glob(self.vcard_path + '*@*'):
if os.path.isfile(jid):
vcards.append(jid)
for xmldoc in vcards:
try:
xml = parse(xmldoc)
except:
pass
else:
name = xml.getElementsByTagName('BDAY')
for node in name:
try:
data = node.childNodes[0].nodeValue
date_dict[xmldoc[len(self.vcard_path):][:-1]] = data
except:
pass
today = datetime.date.today()
for key, value in date_dict.iteritems():
try:
convert_date = datetime.datetime.strptime(value, "%Y-%m-%d")
user_bday = datetime.date(today.year, convert_date.month,
convert_date.day)
except:
continue
if user_bday < today:
user_bday = user_bday.replace(year=today.year+1)
time_to_bday = abs(user_bday - today)
title = "BirthDay Reminder"
text = None
if time_to_bday.days > 5:
continue
if time_to_bday.days == 5:
text = "5 days before BDay"
elif time_to_bday.days == 3:
text = "3 days before BDay"
elif time_to_bday.days == 1:
text = "Tomorrow BDay"
elif time_to_bday.days == 0:
text = "Today BDay"
if not text:
continue
if account:
show_popup(account,key)
else:
for acct in accounts:
show_popup(account, key)
return True
@log_calls('BirthDayPlugin')
def activate(self):
#self.check_birthdays()
self.timeout_id = gobject.timeout_add_seconds(24*3600,
self.check_birthdays)
@log_calls('BirthDayPlugin')
def deactivate(self):
if self.timeout_id > 0:
gobject.source_remove(self.timeout_id)
@log_calls('BirthDayPlugin')
def roster_received(self, obj):
if obj.conn.name not in self.showed_accounts:
self.check_birthdays(obj.conn.name)
self.showed_accounts.append(obj.conn.name)
......@@ -31,10 +31,6 @@ class ChatstatePlugin(GajimPlugin):
@log_calls('ChatstatePlugin')
def init(self):
self.description = _('Chat State Notifications in roster.'
'Font color of the contact varies depending on the chat state.\n'
'The plugin does not work if you use custom font color for contacts in roster.\n'
'http://trac.gajim.org/ticket/3628.\nhttp://xmpp.org/extensions/xep-0085.html')
self.config_dialog = None # ChatstatePluginConfigDialog(self)
self.events_handlers = {'chatstate-received':
(ged.GUI2, self.chatstate_received), }
......
[info]
name: Chatstate in roster
short_name: chatstate
version: 0.5.1
description: Chat State Notifications in roster.
Font color of the contact varies depending on the chat state.
version: 0.5.2
description: Chat State Notifications in roster.<br/>
Font color of the contact varies depending on the chat state.<br/>
The plugin does not work if you use custom font color for contacts in roster.
authors = Denis Fomin <fominde@gmail.com>
homepage = http://trac-plugins.gajim.org/wiki/ChatstatePlugin
max_gajim_version: 0.16.9
......@@ -13,8 +13,6 @@ class ClickableNicknames(GajimPlugin):
@log_calls('ClickableNicknamesPlugin')
def init(self):
self.description = _('Clickable nicknames '
'in the conversation textview.')
self.config_dialog = None # ClickableNicknamesPluginConfigDialog(self)
self.gui_extension_points = {
'chat_control_base': (self.connect_with_chat_control,
......@@ -122,12 +120,21 @@ class Base(object):
if nick.startswith('* '):
nick = nick.lstrip('* ').split(' ')[0]
nick = nick.lstrip(gajim.config.get('before_nickname'))
nick = nick.lstrip(u'\u200E').rstrip(u'\u200E')
nick = nick.lstrip(u'\u200F').rstrip(u'\u200F')
nicks = gajim.contacts.get_nick_list(self.chat_control.account,
self.chat_control.room_jid)
if nick not in nicks:
return
nick = nick + gajim.config.get('gc_refer_to_nick_char') + ' '
return
message_buffer = self.chat_control.msg_textview.get_buffer()
if message_buffer.get_char_count() < 1:
nick = nick + gajim.config.get('gc_refer_to_nick_char')
else:
start, end = message_buffer.get_bounds()
if message_buffer.get_text(start, end, True)[-1] != ' ':
nick = ' ' + nick
nick += ' '
message_buffer.insert_at_cursor(nick)
self.chat_control.msg_textview.grab_focus()
......
[info]
name: Clickable Nicknames
short_name: clickable_nicknames
version: 0.2.1
version: 0.3.2
description: Clickable nicknames in the conversation textview.
authors: Denis Fomin <fominde@gmail.com>
authors: Andrey Musikhin <melomansegfault@gmail.com>
Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/ClickableNicknamesPlugin
max_gajim_version: 0.16.9
......@@ -25,37 +25,33 @@ clients = {
'http://bombusmod.net.ru': ['bombusmod.png', 'Bombusmod'],
'http://ex-im.name/caps': ['bombusmod.png', 'Bombusmod'],
'http://bombusmod.eu,http://bombus.pl': ['bombuspl.png', 'Bombusmod'],
'http://mcabber.com/caps': ['mcabber.png', 'MCabber'],
'http://miranda-im.org/caps': ['miranda.png', 'Miranda'],
'http://www.asterisk.org/xmpp/client/caps': ['asterisk.png', 'Asterisk'],
'http://www.google.com/xmpp/client/caps': ['talkonaut.png', 'Talkonaut'],
'http://talkgadget.google.com/client/caps': ['google.png', 'GTalk'],
'http://oneteam.im/caps': ['oneteamiphone.png', 'OneTeam'],
'http://tkabber.jabber.ru/': ['tkabber.png', 'Tkabber'],
'http://pidgin.im/': ['pidgin.png', 'Pidgin'],
'http://pidgin.im/caps': ['pidgin.png', 'Pidgin'],
'http://qutim.org': ['qutim.png', 'QutIM'],
'http://qutim.org/': ['qutim.png', 'QutIM'],
'http://exodus.jabberstudio.org/caps': ['exodus.png', 'Exodus'],
'http://bitlbee.org/xmpp/caps': ['bitlbee.png', 'Bitlbee'],
'http://coccinella.sourceforge.net/protocol/caps': ['coccinella.png', 'Coccinella'],
'http://mcabber.lilotux.net/caps': ['mcabber.png', 'MCabber'],
'http://dev.jabbim.cz/jabbim/caps': ['jabbim.png', 'Jabbim'],
'http://palringo.com/caps': ['palringo.png', 'Palringo'],
'http://vacuum-im.googlecode.com': ['vacuum.png', 'Vacuum'],
'http://code.google.com/p/vacuum-im/': ['vacuum.png', 'Vacuum'],
'http://vacuum-im.googlecode.com': ['vacuum.png', 'Vacuum-im'],
'http://code.google.com/p/vacuum-im/': ['vacuum.png', 'Vacuum-im'],
'http://jajc.jrudevels.org/caps': ['jajc.png', 'JAJC'],
'http://gaim.sf.net/caps': ['gaim.png', 'Gaim'],
'http://mchat.mgslab.com/': ['mchat.png', 'Mchat'],
'http://online.yandex.ru/caps': ['yaonline.png', 'Yaonline'],
'http://psi-im.org/caps': ['psi.png', 'Psi'],
'http://jimm.net.ru/caps': ['jimm-aspro.png', 'Jimm'],
'http://stranger.kiev.ua/caps': ['fin.png', 'Fin-bot'],
'http://jabga.ru': ['fin.png', 'Fin jabber'],
'http://bluendo.com/protocol/caps': ['lampiro.png', 'Lampiro'],
'nimbuzz:caps': ['nimbuzz.png', 'Nimbuzz'],
'http://nimbuzz.com/caps': ['nimbuzz.png', 'Nimbuzz'],
'http://isida.googlecode.com': ['isida-bot.png', 'Isida'],
'http://isida-bot.com': ['isida-bot.png', 'Isida'],
'http://isida.googlecode.com': ['isida-bot.png', 'iSida Jabber Bot'],
'http://isida-bot.com': ['isida-bot.png', 'iSida Jabber Bot'],
'http://apps.radio-t.com/caps': ['radio-t.png', 'Radio-t'],
'http://pda.qip.ru/caps': ['qippda.png', 'Qip-PDA'],
'http://kopete.kde.org/jabber/caps': ['kopete.png', 'Kopete'],
......@@ -121,8 +117,7 @@ clients = {
'http://sim-im.org/caps': ['sim.png', 'Sim'],
'http://www.igniterealtime.org/project/spark/caps': ['spark.png', 'Spark'],
'http://emess.eqx.su/caps': ['emess.png', 'Emess'],
'http://fin.jabber.ru/caps': ['bot.png', 'Fin-bot'],
'https://www.jappix.com/': ['jappix.png', 'Jappix'],
'http://jappix.org/': ['jappix.png', 'Jappix'],
'http://japyt.googlecode.com': ['japyt.png', 'Japyt'],
'http://www.xfire.com/': ['xfire.png', 'Xfire'],
'http://www.xfire.com/caps': ['xfire.png', 'Xfire'],
......@@ -134,10 +129,8 @@ clients = {
'http://jasmineicq.ru/caps': ['jasmine.png', 'Jasmine'],
'http://tomclaw.com/mandarin_im/caps': ['mandarin.png', 'Mandarin'],
'http://gabber.sourceforge.net': ['gabber.png', 'Gabber'],
'http://www.igniterealtime.org/projects/smack/': ['xabber.png', 'Xabber'],
'http://megafonvolga.ru/': ['megafon.png', 'Megafon'],
'rss@isida-bot.com': ['osiris.png', 'Osiris'],
'libpurple': ['libpurple.png', 'Libpurple'],
'http://www.adium.im/': ['adium.png', 'Adium'],
'http://eqo.com/': ['libpurple.png', 'Eqo'],
'http://instantbird.com/': ['instantbird.png', 'Instantbird'],
......@@ -145,31 +138,35 @@ clients = {
'http://opensource.palm.com/packages.html': ['palm.png', 'Palm'],
'http://spectrum.im/': ['spectrum.png', 'Spectrum'],
'http://tigase.org/messenger': ['tigase.png', 'Tigase'],
'http://jitsi.org' :['jitsi.png', 'Jitsi'],
'http://miranda-ng.org/caps' :['miranda_ng.png', 'Miranda NG'],
'http://monal.im/caps': ['monal.png', 'Monal'],
'http://leechcraft.org/': ['leechcraft.png', 'Leechcraft'],
'http://sawim.ru/caps': ['sawim.png', 'Sawim'],
#
'Poezio' :['poezio.png', 'Poezio'],
'Emacs' :['emacs.png', ''],
'mcabber' :['mcabber.png', ''],
'yaxim' :['yaxim.png', ''],
'Xabber' :['xabber.png', ''],
'Adium' :['adium.png', ''],
'Pidgin': ['pidgin.png', ''],
'Leechcraft': ['leechcraft.png', ''],
'Conversations': ['conversations.png', 'Conversations'],
'ChatSecure': ['chatsecure.png', 'ChatSecure'],
'SecuGab': ['secugab.png', 'Secugab'],
}
libpurple_clients ={
'adium': 'http://www.adium.im/',
'eqo': 'http://eqo.com/',
'finch': 'http://pidgin.im/',
'instantbird': 'http://instantbird.com/',
'meebo': 'https://www.meebo.com/',
'palm': 'http://opensource.palm.com/packages.html',
'pidgin': 'http://pidgin.im/',
'spectrum': 'http://spectrum.im/',
'telepathy-haze': 'http://pidgin.im/'
}
class ClientsIconsPlugin(GajimPlugin):
@log_calls('ClientsIconsPlugin')
def init(self):
self.description = _('Shows the client icons in the roster'
' and in groupchats.\nFor icons in tooltip support, '
'you need to install Gajim r14117 or above.')
self.pos_list = [_('after statusicon'), _('before avatar')]
self.events_handlers = {'presence-received':
self.events_handlers = {'caps-presence-received':
(ged.POSTGUI, self.presence_received),
'gc-presence-received':
(ged.POSTGUI, self.gc_presence_received), }
'caps-disco-received':
(ged.POSTGUI, self.caps_disco_received), }
self.gui_extension_points = {
'groupchat_control': (self.connect_with_groupchat_control,
self.disconnect_from_groupchat_control),
......@@ -206,6 +203,10 @@ class ClientsIconsPlugin(GajimPlugin):
caps = contact.client_caps._node
caps_image , client_name = self.get_icon(caps, contact)
identities = contact.client_caps._lookup_in_cache(
gajim.caps_cache.capscache).identities
if identities and client_name == _('Unknown'):
client_name = identities[0].get('name', _('Unknown'))
caps_image.set_alignment(0, 0)
self.table.attach(caps_image, 1, 2, vcard_current_row,
vcard_current_row + 1, 0, 0, 0, 0)
......@@ -226,6 +227,8 @@ class ClientsIconsPlugin(GajimPlugin):
# rewrite avatar
if vcard_table.get_property('n-columns') == 4:
if tooltip.avatar_image not in vcard_table.get_children():
return
avatar_widget_idx = vcard_table.get_children().index(
tooltip.avatar_image)
vcard_table.remove(vcard_table.get_children()[avatar_widget_idx])
......@@ -254,18 +257,25 @@ class ClientsIconsPlugin(GajimPlugin):
else:
contacts_dict[contact.priority] = [contact]
contact_keys = sorted(contacts_dict.keys())
if not contact_keys:
# contact have not resource
contacts_dict[0] = [contact]
contact_keys = sorted(contacts_dict.keys())
contact_keys.reverse()
#fill clients table
self.table = gtk.Table(4, 1)
self.table.set_property('column-spacing', 2)
first_place = vcard_current_row = vcard_table.get_property('n-rows')
vcard_current_row = 0
for priority in contact_keys:
for acontact in contacts_dict[priority]:
caps = acontact.client_caps._node
caps_image , client_name = self.get_icon(caps, acontact)
identities = acontact.client_caps._lookup_in_cache(
gajim.caps_cache.capscache).identities
if identities and client_name == _('Unknown'):
client_name = identities[0].get('name', _('Unknown'))
caps_image.set_alignment(0, 0)
self.table.attach(caps_image, 1, 2, vcard_current_row,
vcard_current_row + 1, gtk.FILL, gtk.FILL, 0, 0)
......@@ -292,6 +302,8 @@ class ClientsIconsPlugin(GajimPlugin):
# rewrite avatar
if vcard_table.get_property('n-columns') == 4:
if tooltip.avatar_image not in vcard_table.get_children():
return
avatar_widget_idx = vcard_table.get_children().index(
tooltip.avatar_image)
vcard_table.remove(vcard_table.get_children()[avatar_widget_idx])
......@@ -303,12 +315,7 @@ class ClientsIconsPlugin(GajimPlugin):
if not caps:
return gtk.image_new_from_pixbuf(self.default_pixbuf), _('Unknown')
if 'pidgin.im' in caps:
caps = 'libpurple'
for client in libpurple_clients:
if client in contact.resource.lower():
caps = libpurple_clients[client]
client_name = _('Unknown')
caps_from_jid = self.check_jid(contact.jid)
if caps_from_jid:
caps = caps_from_jid
......@@ -319,6 +326,12 @@ class ClientsIconsPlugin(GajimPlugin):
client_name = clients.get(caps_[0].split()[0], ('', _('Unknown')))[1]
else:
client_icon = None
if client_name == _('Unknown'):
identities = contact.client_caps._lookup_in_cache(
gajim.caps_cache.capscache).identities
if identities:
client_name = identities[0].get('name', _('Unknown'))
client_icon = clients.get(client_name.split()[0], (None,))[0]
if not client_icon:
return gtk.image_new_from_pixbuf(self.default_pixbuf), _('Unknown')
......@@ -344,7 +357,7 @@ class ClientsIconsPlugin(GajimPlugin):
caps = 'facebook.com'
elif '@vk.com' in jid and self.config['show_facebook']:
caps = 'vk.com'
elif jid == 'juick@juick.com':
elif 'juick.com' in jid:
caps = 'http://juick.com/caps'
elif jid == 'psto@psto.net':
caps = 'psto@psto.net'
......@@ -362,12 +375,13 @@ class ClientsIconsPlugin(GajimPlugin):
roster.model)
if not child_iters:
return
if roster.model[child_iters[0]][self.renderer_num] is None:
caps = contact.client_caps._node
if not caps:
caps = self.check_jid(jid)
self.set_icon(roster.model, child_iters[0], self.renderer_num,
caps)
for iter_ in child_iters:
if roster.model[iter_][self.renderer_num] is None:
caps = contact.client_caps._node
if not caps:
caps = self.check_jid(jid)
self.set_icon(roster.model, iter_, self.renderer_num,
caps, contact)
@log_calls('ClientsIconsPlugin')
def connect_with_groupchat_control(self, chat_control):
......@@ -411,7 +425,7 @@ class ClientsIconsPlugin(GajimPlugin):
continue
caps = gc_contact.client_caps._node
self.set_icon(chat_control.model, iter_, self.muc_renderer_num,
caps)
caps, gc_contact)
chat_control.draw_all_roles()
# Recalculate column width for ellipsizin
chat_control.list_treeview.columns_autosize()
......@@ -488,81 +502,120 @@ class ClientsIconsPlugin(GajimPlugin):
self.renderer_num + 1:]
roster.setup_and_draw_roster()
def presence_received(self, iq_obj):
def caps_disco_received(self, iq_obj):
if not self.config['show_in_roster']:
return
roster = gajim.interface.roster
contact = gajim.contacts.get_contact_with_highest_priority(
iq_obj.conn.name, iq_obj.jid)
contact = gajim.contacts.get_contact_from_full_jid(iq_obj.conn.name,
iq_obj.jid)
if contact is None:
room_jid, nick = gajim.get_room_and_nick_from_fjid(iq_obj.fjid)
contact = gajim.contacts.get_gc_contact(iq_obj.conn.name, room_jid,
nick)
if contact:
gc_control = gajim.interface.msg_win_mgr.get_gc_control(
iq_obj.jid, iq_obj.conn.name)
iter_ = gc_control.get_contact_iter(nick)
self.set_icon(gc_control.model, iter_, self.muc_renderer_num,
None, contact)
return
if not contact:
return
child_iters = roster._get_contact_iter(iq_obj.jid, iq_obj.conn.name,
contact, roster.model)
if not child_iters:
return
for iter_ in child_iters:
caps = contact.client_caps._node
caps_ = self.check_jid(iq_obj.jid)
if caps_:
caps = caps_
self.set_icon(roster.model, iter_, self.renderer_num,
caps, contact)
def presence_received(self, iq_obj):
roster = gajim.interface.roster
contact = gajim.contacts.get_contact_from_full_jid(iq_obj.conn.name,
iq_obj.jid)
if contact is None:
room_jid, nick = gajim.get_room_and_nick_from_fjid(iq_obj.fjid)
contact = gajim.contacts.get_gc_contact(iq_obj.conn.name, room_jid,
nick)
if contact:
self.gc_presence_received(iq_obj, contact)
return
if not contact:
return
if not self.config['show_in_roster']:
return
contact = gajim.contacts.get_contact_with_highest_priority(
iq_obj.conn.name, iq_obj.jid)
if iq_obj.resource == 'local':
# zeroconf
return
iter_ = roster._get_contact_iter(iq_obj.jid, iq_obj.conn.name, contact,
roster.model)[0]
iters = roster._get_contact_iter(iq_obj.jid, iq_obj.conn.name, contact,
roster.model)
iter_ = iters[0]
if contact.show == 'error':
self.set_icon(roster.model, iter_, self.renderer_num, None)
self.set_icon(roster.model, iter_, self.renderer_num, None, contact)
return
if contact != iq_obj.contact:
if contact.get_full_jid() != iq_obj.fjid:
# higest contact changed
if roster.model[iter_][self.renderer_num] is not None:
caps = contact.client_caps._node
if caps:
self.set_icon(roster.model, iter_, self.renderer_num, caps)
self.set_icon(roster.model, iter_, self.renderer_num,
caps, contact)
return
caps = None
tag = iq_obj.stanza.getTags('c')
if tag:
caps = tag[0].getAttr('node')
if caps:
if 'pidgin.im' in caps:
caps = 'libpurple'
for client in libpurple_clients:
if client in contact.resource.lower():
caps = libpurple_clients[client]
caps_from_jid = self.check_jid(iq_obj.jid)
if caps_from_jid:
caps = caps_from_jid
self.set_icon(roster.model, iter_, self.renderer_num, caps)
for iter_ in iters:
self.set_icon(roster.model, iter_, self.renderer_num, caps, contact)
def gc_presence_received(self, iq_obj):
def gc_presence_received(self, iq_obj, contact):
if not self.config['show_in_groupchats']:
return
contact = gajim.contacts.get_gc_contact(iq_obj.conn.name,
iq_obj.presence_obj.jid, iq_obj.nick.decode('utf-8'))
if not contact:
return
caps = None
tag = iq_obj.stanza.getTags('c')
if tag:
caps = tag[0].getAttr('node')
if 'pidgin.im' in caps:
caps = 'libpurple'
iter_ = iq_obj.gc_control.get_contact_iter(iq_obj.nick.decode('utf-8'))
model = iq_obj.gc_control.model
if model[iter_][self.muc_renderer_num] is not None:
return
self.set_icon(model, iter_, self.muc_renderer_num, caps)
def set_icon(self, model, iter_, pos, caps):
if not caps:
if self.config['show_unknown_icon']:
model[iter_][pos] = self.default_pixbuf
gc_control = gajim.interface.msg_win_mgr.get_gc_control(iq_obj.jid,
iq_obj.conn.name)
iter_ = gc_control.get_contact_iter(iq_obj.resource.decode('utf-8'))
model = gc_control.model
if model[iter_][self.muc_renderer_num] is not None:
return
self.set_icon(model, iter_, self.muc_renderer_num, caps, contact)
caps_ = caps.split('#')[0].split()
if caps_:
client_icon = clients.get(caps_[0].split()[0], (None,))[0]
def set_icon(self, model, iter_, pos, caps, contact):
if caps:
caps_ = caps.split('#')[0].split()
if caps_:
client_icon = clients.get(caps_[0].split()[0], (None,))[0]
else:
client_icon = None
if not client_icon:
identities = contact.client_caps._lookup_in_cache(
gajim.caps_cache.capscache).identities
if identities:
client_name = identities[0].get('name', _('Unknown'))
client_icon = clients.get(client_name.split()[0], (None,))[0]
if not client_icon:
if self.config['show_unknown_icon']:
model[iter_][pos] = self.default_pixbuf
......
......@@ -6,6 +6,7 @@
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="border_width">9</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkCheckButton" id="show_in_roster">
......
clients_icons/icons/chatsecure.png

999 B