...
 
Commits (129)
## Welcome to the Gajim Plugins Wiki
Here are some plugins that are written for <a href="https://gajim.org">Gajim</a> by the community. Report problems about those plugins here.
In this place you find all plugins that are written for <a href="https://gajim.org">Gajim</a> by the community. If you experience any problems with those plugins, please report them here.
## How to install
## How to install plugins
There are several ways to install a plugin:
- You can browse / download / enable / configure plugins in Gajim, Edit menu -> Plugins.
- You can clone the repository directly from [here](https://dev.gajim.org/gajim/gajim-plugins) and copy it to
- You can browse / download / enable / configure plugins from within Gajim via 'Gajim' > 'Plugins' menu.
- You can also clone the repository directly from our Git and copy it to:
**Linux:** `~/.local/share/gajim/plugins/`
**Linux:** ~/.local/share/gajim/plugins/
**Windows:** `C:\Users\USERNAME\AppData\Roaming\Gajim\Plugins`
**Windows:** C:\Users\USERNAME\AppData\Roaming\Gajim\Plugins
- Alternatively (for developing), you can also symlink the gajim-plugins repository to Gajim's plugin path
**Symlink:** `ln -s /path/to/gajim-plugins-repository/* ~/.local/share/gajim/plugins/`
**For each major Gajim version there is a different plugins branch:**
| Version | Plugins branch |
| ------- | -------------- |
|Gajim 1.0|[1.0 branch](https://dev.gajim.org/gajim/gajim-plugins/tree/gajim_1.0)|
|Gajim 1.1|[1.1 branch](https://dev.gajim.org/gajim/gajim-plugins/tree/gajim_1.1)|
|Gajim master|[master branch](https://dev.gajim.org/gajim/gajim-plugins/tree/master)|
*Note: Using master branch for plugins requires frequent updates of both Gajim and plugins!*
## Share / Improve Plugins
## Share / improve Plugins
You have written a new plugin or want to improve an already existing one?
First, Thanks for that! Here is how to do that:
First, thanks for that! Here is how to start:
- Register an account [here](https://dev.gajim.org/users/sign_in)
- Tell us about your plans at gajim@conference.gajim.org (we need to set your permission on Gitlab)
- Register an account on our Gitlab [here](https://dev.gajim.org/users/sign_in)
- Tell us about your plans at [gajim@conference.gajim.org](xmpp:gajim@conference.gajim.org?join)
- Fork the Gajim-Plugins [repository](https://dev.gajim.org/gajim/gajim-plugins)
- When you are finished make a pull request against the main repository
- When you are finished, make a pull request against the main repository. You can read about how to use git [here](https://dev.gajim.org/gajim/gajim/wikis/howtogit).
- Additionally, there is a list of [plugin events](https://dev.gajim.org/gajim/gajim/wikis/development/pluginsevents) which might be helpful
**Before you put in any work, please contact us on gajim@conference.gajim.org**
**Before you put in any work, please contact us on [gajim@conference.gajim.org](xmpp:gajim@conference.gajim.org?join)**
**Dont use dev.gajim.org for any projects that are not directly for the benefit of Gajim**
## Plugins list
* [AntiSpamPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/AntiSpamPlugin) Block some incoming messages
* [AppindicatorSupportPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/AppindicatorSupportPlugin) Plugin that add indicator applet support to gajim
* [BannerTweaksPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/BannerTweaksPlugin) Ability to configure the banner in chat windows
* [BirthdayReminderPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/BirthdayReminderPlugin) Birthday reminder
* [ChatstatePlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/ChatstatePlugin) Chat State Notifications in roster.
* [ClickableNicknamesPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/ClickableNicknamesPlugin) Click the left mouse button on a nickname in a groupchat conversation to insert the nickname in the input field.
* [ClientsIconsPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/ClientsIconsPlugin) Shows the clients icons in the roster and in groupchats.
* [EmoticonPackPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/EmoticonPackPlugin) A pack of emoticon themes
* [FileSharing](https://dev.gajim.org/gajim/gajim-plugins/wikis/FileSharing) Allows you to share folders with your peers using jingle file transfer.
* [FlashingKeyboardPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/FlashingKeyboardPlugin) Make keyboard flash when we get a new message.
* [GnomeSessionManagerPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/GnomeSessionManagerPlugin) set and react on GNOME SessionManager presence settings.
* [GoogleTranslationPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/GoogleTranslationPlugin) Automatically translate incoming messages.
* [HamsterIntegration](https://dev.gajim.org/gajim/gajim-plugins/wikis/HamsterIntegration) Integration with project hamster.
* [HttpUploadPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/HttpUploadPlugin) Share files with offline users, multi client users and even in MUCs with [XEP-0363](http://xmpp.org/extensions/xep-0363.html)
* [ImagePlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/ImagePlugin) This plugin is designed to send a small(0 - 40 kb) graphic image to your contact.
* [JuickPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/JuickPlugin) More comfortable use of juick.com (microblogging service).
* [LatexPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/LatexPlugin) Render latex expressions.
* [LengthNotifierPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/LengthNotifierPlugin) Be notified when message length reaches a limit.
* [MessageBoxSizePlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/MessageBoxSizePlugin) Allows you to adjust the height of the new message input field.
* [MprisSupportPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/MprisSupportPlugin) MPRIS2 support.
* [NowListenPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/NowListenPlugin) Copy tune info to conversation input box.
* [OffTheRecordPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/OffTheRecordPlugin) Provides protocol independent encryption (see https://otr.cypherpunks.ca for more information).
* [OfflineBookmarksPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/OfflineBookmarksPlugin) Save bookmarks offline inside the plugin configuration file.
* [PluginInstallerPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/PluginInstallerPlugin) install new plugins in one click.
* [PluginsTranslationsPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/PluginsTranslationsPlugin) This plugin contains translations files for Gajim plugins.
* [QuickRepliesPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/QuickRepliesPlugin) Plugin for quick replies.
* [RegexFilterPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/RegexFilterPlugin) Regex filtering of incoming messages.
* [RosterTweaksPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/RosterTweaksPlugin) Allows user to tweak roster window appearance.
* [ServerStatusIconsPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/ServerStatusIconsPlugin) Replace standard Gajim status icons with server specific for known XMPP server accounts.
* [SetLocationPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/SetLocationPlugin) Allows you to manually specify your geographical location.
* [SnarlNotifications](https://dev.gajim.org/gajim/gajim-plugins/wikis/SnarlNotifications) Shows events notification using [Snarl](http://snarl.fullphat.net/) under Microsoft Windows.
* [SyntaxHighlightPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/syntaxhighlightplugin) Highlights Code in the Chat Window for many languages.
* [TictactoePlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/TictactoePlugin) Play Tic tac toe with your contacts.
* [TriggersPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/TriggersPlugin) Configure Gajim's behaviour when receiving some events.
* [ThemeSwitcherPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/ThemeSwitcherPlugin) Change the active GTK+ theme.
* [UbuntuIntegrationPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/UbuntuIntegrationPlugin) The plugin integrates Gajim with the Ubuntu Messaging Menu and the Me Menu.
* [UrlImagePreviewPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/UrlImagePreviewPlugin) Url image preview in chatbox.
* [UrlShortenerPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/UrlShortenerPlugin) Allows users to shorten a long URL.
* [WhiteboardPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/WhiteboardPlugin) Ability to share a whiteboard with a contact
* [WicdSupportPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/WicdSupportPlugin) Support for autodetection of network status for Wicd Network Manager.
* [WrongLayoutPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/WrongLayoutPlugin) Press alt+r to convert chars typed in wrong layout( Rus<>Eng).
* [OmemoGajimPlugin](https://dev.gajim.org/gajim/gajim-plugins/wikis/OmemoGajimPlugin) Experimental plugin for the OMEMO Multi-End Message and Object Encryption.
\ No newline at end of file
All available plugins are listed [here](https://dev.gajim.org/gajim/gajim-plugins/wikis/home).
{"afaik": "as far as I know",
"afaict": "as far as I can tell",
"afk": "away from keyboard",
"atm": "at the moment",
"bbiab": "be back in a bit",
"bbiaf": "be back in a few (minutes)",
"bbl": "be back later",
"bbs": "be back soon",
"b/c": "because",
"bf": "boyfriend",
"bfo": "blinding flash of the obvious",
"brb": "be right back",
"bsod": "blue screen of death",
"btw": "by the way",
"ciao": "Italian for goodbye",
"ctrn": "can't talk right now",
"cul8r": "see you later",
"cya": "see ya",
"dhtb": "don't have the bandwidth",
"f2f": "face to face",
"fubar": "fucked up beyond all recognition",
"fwiw": "for what it's worth",
"fyi": "for your information",
"gmta": "great minds think alike",
"iam": "in a meeting",
"ianal": "I am not a lawyer",
"ihmb": "I hate my boss",
"iirc": "if I recall correctly",
"imho": "in my humble opinion",
"imo": "in my opinion",
"iow": "in other words",
"irl": "in real life",
"<g>": "grin",
"*g*": "grin",
"gf": "girlfriend",
"gmta": "great minds think alike",
"g2g": "got to go",
"jid": "jabber identifier",
"j/k": "just kidding",
"ok": "okay",
"lol": "laugh out loud",
"l8r": "later",
"msg": "message",
"n/m": "never mind",
"n/p": "no problem",
"oAo": "over and out!",
"omg": "oh my god",
"oob": "out of band",
"otoh": "on the other hand",
"oww": "oops, wrong window!",
"otp": "on the phone",
"pita": "pain in the ass",
"pov": "point of view",
"pw": "password",
"rotfl": "rolling on the floor laughing",
"rsn": "real soon now",
"rtfm": "read the friendly manual",
"slap": "sounds like a plan",
"thx": "thanks",
"tia": "thanks in advance",
"tla": "three-letter arconym",
"ttfn": "ta ta for now",
"ttyl": "talk to you later",
"wb": "welcome back",
"wfm": "works for me",
"wtf": "what the fuck?!",
"wtg": "way to go!",
"xfer": "transfer",
"ymmv": "your mileage may vary",}
DEFAULT_DATA = {
"afaik": "as far as I know",
"afaict": "as far as I can tell",
"afk": "away from keyboard",
"atm": "at the moment",
"bbiab": "be back in a bit",
"bbiaf": "be back in a few (minutes)",
"bbl": "be back later",
"bbs": "be back soon",
"b/c": "because",
"bf": "boyfriend",
"bfo": "blinding flash of the obvious",
"brb": "be right back",
"bsod": "blue screen of death",
"btw": "by the way",
"ciao": "Italian for goodbye",
"ctrn": "can't talk right now",
"cul8r": "see you later",
"cya": "see ya",
"dhtb": "don't have the bandwidth",
"f2f": "face to face",
"fubar": "fucked up beyond all recognition",
"fwiw": "for what it's worth",
"fyi": "for your information",
"iam": "in a meeting",
"ianal": "I am not a lawyer",
"ihmb": "I hate my boss",
"iirc": "if I recall correctly",
"imho": "in my humble opinion",
"imo": "in my opinion",
"iow": "in other words",
"irl": "in real life",
"<g>": "grin",
"*g*": "grin",
"gf": "girlfriend",
"gmta": "great minds think alike",
"g2g": "got to go",
"jid": "jabber identifier",
"j/k": "just kidding",
"ok": "okay",
"lol": "laugh out loud",
"l8r": "later",
"msg": "message",
"n/m": "never mind",
"n/p": "no problem",
"oAo": "over and out!",
"omg": "oh my god",
"oob": "out of band",
"otoh": "on the other hand",
"oww": "oops, wrong window!",
"otp": "on the phone",
"pita": "pain in the ass",
"pov": "point of view",
"pw": "password",
"rotfl": "rolling on the floor laughing",
"rsn": "real soon now",
"rtfm": "read the friendly manual",
"slap": "sounds like a plan",
"thx": "thanks",
"tia": "thanks in advance",
"tla": "three-letter arconym",
"ttfn": "ta ta for now",
"ttyl": "talk to you later",
"wb": "welcome back",
"wfm": "works for me",
"wtf": "what the fuck?!",
"wtg": "way to go!",
"xfer": "transfer",
"ymmv": "your mileage may vary",
}
# -*- coding: utf-8 -*-
## This file is part of Gajim.
##
## Gajim is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 3 only.
##
## Gajim is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
##
'''
Acronyms expander plugin.
:author: Mateusz Biliński <mateusz@bilinski.it>
:since: 9th June 2008
:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it>
:license: GPL
'''
import os
from gi.repository import GObject
# Copyright (C) 2008 Mateusz Biliński <mateusz AT bilinski.it>
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of Acronyms Expander.
#
# Acronyms Expander is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; version 3 only.
#
# Acronyms Expander is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Acronyms Expander. If not, see <http://www.gnu.org/licenses/>.
import json
import logging
from pathlib import Path
from functools import partial
from gi.repository import GLib
from gajim.common import app
from gajim.common import configpaths
from gajim.plugins import GajimPlugin
from gajim.plugins.helpers import log, log_calls
from gajim.plugins.plugins_i18n import _
# Since Gajim 1.1.0 _() has to be imported
try:
from gajim.common.i18n import _
except ImportError:
pass
from acronyms_expander.acronyms import DEFAULT_DATA
from acronyms_expander.gtk.config import ConfigDialog
log = logging.getLogger('gajim.plugin_system.acronyms')
class AcronymsExpanderPlugin(GajimPlugin):
@log_calls('AcronymsExpanderPlugin')
class AcronymsExpanderPlugin(GajimPlugin):
def init(self):
self.description = _('Replaces acronyms (or other strings) '
'with given expansions/substitutes.')
self.config_dialog = None
'with given expansions/substitutes.')
self.config_dialog = partial(ConfigDialog, self)
self.gui_extension_points = {
'chat_control_base': (self.connect_with_chat_control_base,
self.disconnect_from_chat_control_base)
}
self.config_default_values = {
'INVOKER': (' ', ''),
'ACRONYMS': ({'/slap': '/me slaps',
'PS-': 'plug-in system',
'G-': 'Gajim',
'GNT-': 'https://dev.gajim.org/gajim/gajim/issues',
'GW-': 'https://dev.gajim.org/gajim/gajim/wikis/home',
},
''),
'chat_control_base': (self._connect, self._disconnect)
}
if 'ACRONYMS' not in self.config:
myAcronyms = self.get_own_acronyms_list()
self.config['ACRONYMS'].update(myAcronyms)
@log_calls('AcronymsExpanderPlugin')
def get_own_acronyms_list(self):
data_file = self.local_file_path('acronyms')
if not os.path.isfile(data_file):
return {}
data = open(data_file, 'r', encoding='utf-8')
acronyms = eval(data.read())
data.close()
self._invoker = ' '
self._replace_in_progress = False
self._handler_ids = {}
self.acronyms = self._load_acronyms()
@staticmethod
def _load_acronyms():
try:
data_path = Path(configpaths.get('PLUGINS_DATA'))
except KeyError:
# PLUGINS_DATA was added in 1.0.99.1
return DEFAULT_DATA
path = data_path / 'acronyms' / 'acronyms'
if not path.exists():
return DEFAULT_DATA
with path.open('r') as file:
acronyms = json.load(file)
return acronyms
@log_calls('AcronymsExpanderPlugin')
def textbuffer_live_acronym_expander(self, tb):
"""
@param tb gtk.TextBuffer
"""
#assert isinstance(tb,gtk.TextBuffer)
ACRONYMS = self.config['ACRONYMS']
INVOKER = self.config['INVOKER']
t = tb.get_text(tb.get_start_iter(), tb.get_end_iter(), True)
#log.debug('%s %d'%(t, len(t)))
if t and t[-1] == INVOKER:
#log.debug('changing msg text')
base, sep, head=t[:-1].rpartition(INVOKER)
log.debug('%s | %s | %s'%(base, sep, head))
if head in ACRONYMS:
head = ACRONYMS[head]
#log.debug('head: %s'%(head))
t = ''.join((base, sep, head, INVOKER))
#log.debug("setting text: '%s'"%(t))
GObject.idle_add(tb.set_text, t)
@log_calls('AcronymsExpanderPlugin')
def connect_with_chat_control_base(self, chat_control):
d = {}
tv = chat_control.msg_textview
tb = tv.get_buffer()
h_id = tb.connect('changed', self.textbuffer_live_acronym_expander)
d['h_id'] = h_id
chat_control.acronyms_expander_plugin_data = d
return True
@log_calls('AcronymsExpanderPlugin')
def disconnect_from_chat_control_base(self, chat_control):
d = chat_control.acronyms_expander_plugin_data
tv = chat_control.msg_textview
tv.get_buffer().disconnect(d['h_id'])
@staticmethod
def _save_acronyms(acronyms):
try:
data_path = Path(configpaths.get('PLUGINS_DATA'))
except KeyError:
# PLUGINS_DATA was added in 1.0.99.1
return
path = data_path / 'acronyms'
if not path.exists():
path.mkdir(parents=True)
filepath = path / 'acronyms'
with filepath.open('w') as file:
json.dump(acronyms, file)
def set_acronyms(self, acronyms):
self.acronyms = acronyms
self._save_acronyms(acronyms)
def _on_buffer_changed(self, _textview, buffer_, contact, account):
if self._replace_in_progress:
return
if buffer_.get_char_count() < 2:
return
# Get iter at cursor
insert_iter = buffer_.get_iter_at_mark(buffer_.get_insert())
if insert_iter.get_offset() < 2:
# We need at least 2 chars and an invoker
return
# Get last char
insert_iter.backward_char()
if insert_iter.get_char() != self._invoker:
log.debug('"%s" not an invoker', insert_iter.get_char())
return
# Get to the start of the last word
word_start_iter = insert_iter.copy()
word_start_iter.backward_word_start()
# Get last word and cut invoker
last_word = word_start_iter.get_slice(insert_iter).strip()
if contact.is_groupchat():
nick_list = app.contacts.get_nick_list(account, contact.jid)
if last_word in nick_list:
log.info('Groupchat participant has same nick as acronym')
return
if contact.is_pm_contact:
if last_word == contact.get_shown_name():
log.info('Contact name equals acronym')
return
substitute = self.acronyms.get(last_word)
if substitute is None:
log.debug('%s not an acronym', last_word)
return
# Replace
word_end_iter = word_start_iter.copy()
word_end_iter.forward_word_end()
GLib.idle_add(self._replace_text,
buffer_,
word_start_iter,
word_end_iter,
substitute)
def _replace_text(self, buffer_, start, end, substitute):
self._replace_in_progress = True
buffer_.delete(start, end)
buffer_.insert(start, substitute)
self._replace_in_progress = False
def _connect(self, chat_control):
textview = chat_control.msg_textview
handler_id = textview.connect('text-changed',
self._on_buffer_changed,
chat_control.contact,
chat_control.account)
self._handler_ids[id(textview)] = handler_id
def _disconnect(self, chat_control):
textview = chat_control.msg_textview
handler_id = self._handler_ids.get(id(textview))
if handler_id is not None:
textview.disconnect(handler_id)
del self._handler_ids[id(textview)]
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of Acronyms Expander.
#
# Acronyms Expander is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; version 3 only.
#
# Acronyms Expander is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Acronyms Expander. If not, see <http://www.gnu.org/licenses/>.
from pathlib import Path
from gi.repository import Gtk
from gi.repository import Gdk
from gajim.common import app
from gajim.plugins.plugins_i18n import _
from gajim.plugins.helpers import get_builder
class ConfigDialog(Gtk.ApplicationWindow):
def __init__(self, plugin, transient):
Gtk.ApplicationWindow.__init__(self)
self.set_application(app.app)
self.set_show_menubar(False)
self.set_title(_('Acronyms Configuration'))
self.set_transient_for(transient)
self.set_default_size(400, 400)
self.set_type_hint(Gdk.WindowTypeHint.DIALOG)
self.set_modal(True)
self.set_destroy_with_parent(True)
ui_path = Path(__file__).parent
self._ui = get_builder(ui_path.resolve() / 'config.ui')
self._plugin = plugin
self.add(self._ui.grid)
self._fill_list()
self.show_all()
self._ui.connect_signals(self)
self.connect('destroy', self._on_destroy)
def _fill_list(self):
for acronym, substitute in self._plugin.acronyms.items():
self._ui.acronyms_store.append([acronym, substitute])
def _on_acronym_edited(self, _renderer, path, new_text):
iter_ = self._ui.acronyms_store.get_iter(path)
self._ui.acronyms_store.set_value(iter_, 0, new_text)
def _on_substitute_edited(self, _renderer, path, new_text):
iter_ = self._ui.acronyms_store.get_iter(path)
self._ui.acronyms_store.set_value(iter_, 1, new_text)
def _on_add_clicked(self, _button):
self._ui.acronyms_store.append(['', ''])
row = self._ui.acronyms_store[-1]
self._ui.acronyms_treeview.scroll_to_cell(
row.path, None, False, 0, 0)
self._ui.selection.unselect_all()
self._ui.selection.select_path(row.path)
def _on_remove_clicked(self, _button):
model, paths = self._ui.selection.get_selected_rows()
references = []
for path in paths:
references.append(Gtk.TreeRowReference.new(model, path))
for ref in references:
iter_ = model.get_iter(ref.get_path())
self._ui.acronyms_store.remove(iter_)
def _on_destroy(self, *args):
acronyms = {}
for row in self._ui.acronyms_store:
acronym, substitute = row
if not acronym or not substitute:
continue
acronyms[acronym] = substitute
self._plugin.set_acronyms(acronyms)
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkListStore" id="acronyms_store">
<columns>
<!-- column-name acronym -->
<column type="gchararray"/>
<!-- column-name substitute -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkGrid" id="grid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">12</property>
<property name="margin_right">12</property>
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="acronyms_treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="model">acronyms_store</property>
<property name="search_column">1</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="selection">
<property name="mode">multiple</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="title" translatable="yes">Acronym</property>
<property name="clickable">True</property>
<property name="sort_indicator">True</property>
<property name="sort_column_id">0</property>
<child>
<object class="GtkCellRendererText">
<property name="editable">True</property>
<signal name="edited" handler="_on_acronym_edited" swapped="no"/>
</object>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="resizable">True</property>
<property name="title" translatable="yes">Substitute</property>
<property name="clickable">True</property>
<property name="sort_indicator">True</property>
<property name="sort_column_id">0</property>
<child>
<object class="GtkCellRendererText">
<property name="editable">True</property>
<signal name="edited" handler="_on_substitute_edited" swapped="no"/>
</object>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkButtonBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">start</property>
<signal name="clicked" handler="_on_add_clicked" swapped="no"/>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">list-add-symbolic</property>
</object>
</child>
<style>
<class name="suggested-action"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Remove</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">end</property>
<signal name="clicked" handler="_on_remove_clicked" swapped="no"/>
<style>
<class name="destructive-action"/>
</style>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
</object>
</interface>
[info]
name: Acronyms Expander
short_name: acronyms_expander
version: 0.4
version: 1.1.5
description: Replaces acronyms (or other strings) with given expansions/substitutes.
authors: Mateusz Biliński <mateusz@bilinski.it>
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/AcronymsExpanderPlugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
......@@ -26,17 +26,15 @@ Block some incoming messages
from gi.repository import Gtk
import nbxmpp
from gajim.common import app, ged
from gajim.common import app
from gajim.common import ged
from gajim.plugins import GajimPlugin
from gajim.plugins.helpers import log, log_calls
from gajim.plugins.gui import GajimPluginConfigDialog
from gajim.plugins.plugins_i18n import _
# Since Gajim 1.1.0 _() has to be imported
try:
from gajim.common.i18n import _
except ImportError:
pass
class AntiSpamPlugin(GajimPlugin):
......@@ -164,13 +162,6 @@ class AntiSpamPlugin(GajimPlugin):
log.info('Anti_spam wrong message type: %s', obj.mtype)
return
# only for 'chat' messages
if obj.receipt_request_tag and obj.mtype == 'chat':
receipt = nbxmpp.Message(to=obj.fjid, typ='chat')
receipt.setTag('received', namespace='urn:xmpp:receipts', attrs={'id': obj.id_})
if obj.thread_id:
receipt.setThread(obj.thread_id)
app.connections[obj.conn.name].connection.send(receipt, now=True)
question = self.config['msgtxt_question']
log.info('Anti_spam enabled for %s, question: %s', jid, question)
message = _('Antispam enabled. Please answer the question. The message must only ' + \
......@@ -182,7 +173,7 @@ class AntiSpamPlugin(GajimPlugin):
else: # for 'normal' type
stanza = nbxmpp.Message(to=jid, body=message, subject='Antispam enabled', typ=obj.mtype)
app.connections[obj.conn.name].connection.send(stanza, now=True)
app.connections[obj.conn.name].connection.send(stanza)
def contain_answer(self, msg, answer):
return answer in msg.split('\n')
......
[info]
name: Anti Spam
short_name: anti_spam
version: 1.4.5
version: 1.4.21
description: Block some incoming messages.
authors = Yann Leboulanger <asterix@lagaule.org>
authors: Yann Leboulanger <asterix@lagaule.org>
Denis Fomin <fominde@gmail.com>
Ilya Kanyukov <ilya.kanukov@gmail.com>
homepage = https://dev.gajim.org/gajim/gajim-plugins/wikis/AntiSpamPlugin
min_gajim_version: 0.16.11
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/AntiSpamPlugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Ayatana Appindicator integration
short_name: appindicator_integration
version: 1.1.1
version: 1.1.21
description: This plugin integrates Gajim with the Ayatana AppIndicator. You must have gir1.2-ayatanaappindicator3-0.1 installed to enable this plugin.
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/AppindicatorSupportPlugin
authors: Denis Borenko <borenko@rambler.ru>
Philipp Hörist <philipp@hoerist.com>
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
......@@ -14,11 +14,16 @@ import gi
from gi.repository import Gtk, GLib, Gdk
try:
gi.require_version('AyatanaAppIndicator3', '0.1')
from gi.repository import AyatanaAppIndicator3 as appindicator
gi.require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 as appindicator
ERRORMSG = None
except (ValueError, ImportError):
ERRORMSG = 'Please install libappindicator3'
try:
gi.require_version('AyatanaAppIndicator3', '0.1')
from gi.repository import AyatanaAppIndicator3 as appindicator
ERRORMSG = None
except (ValueError, ImportError):
ERRORMSG = 'Please install libappindicator3'
from gajim.common import app, ged
from gajim.common import configpaths
......
[info]
name: Banner Tweaks
short_name: banner_tweaks
version: 0.1.4
version: 1.1.0
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
min_gajim_version: 0.16.11
authors: Mateusz Biliński <mateusz@bilinski.it>
homepage: http://trac-plugins.gajim.org/wiki/BannerTweaksPlugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Birthday reminder
short_name: birthday_reminder
version: 1.0.1
version: 1.1.2
description: Reminds you if a contact of yours has birthday
authors: Evgeniy Popov <evgeniypopov@gmail.com>
Philipp Hörist <philipp@hoerist.com>
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/BirthdayReminderPlugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
# This file is part of Birthday Reminder.
#
# Birthday Reminder is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; version 3 only.
#
# Birthday Reminder is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Birthday Reminder. If not, see <http://www.gnu.org/licenses/>.
import os
import json
import datetime
......@@ -5,17 +19,13 @@ import logging
from gi.repository import GLib
from gajim.plugins import GajimPlugin
from gajim.common import configpaths
from gajim.common import app
from gajim.common import ged
# Since Gajim 1.1.0 _() has to be imported
try:
from gajim.common.i18n import _
except ImportError:
pass
from gajim.plugins import GajimPlugin
from gajim.plugins.plugins_i18n import _
log = logging.getLogger('gajim.plugin_system.birthday')
......@@ -30,7 +40,7 @@ class BirthDayPlugin(GajimPlugin):
self.events_handlers = {
'vcard-received': (ged.GUI2, self._vcard_received)}
self.timeout_id = None
self._timeout_id = None
self._timeout_id_start = None
self.showed_accounts = []
......@@ -46,7 +56,7 @@ class BirthDayPlugin(GajimPlugin):
def deactivate(self):
if self._timeout_id is not None:
GLib.source_remove(self.timeout_id)
GLib.source_remove(self._timeout_id)
if self._timeout_id_start is not None:
GLib.source_remove(self._timeout_id_start)
......@@ -113,7 +123,8 @@ class BirthDayPlugin(GajimPlugin):
return True
def _find_contact(self, jid):
@staticmethod
def _find_contact(jid):
accounts = app.contacts.get_accounts()
for account in accounts:
contact = app.contacts.get_contacts(account, jid)
......
[info]
name: Chatstate in roster
short_name: chatstate
version: 0.5.6
version: 1.1.0
description: Chat State Notifications in roster.
Font color of the contact varies depending on the chat state.
The plugin does not work if you use custom font color for contacts in roster.
authors = Denis Fomin <fominde@gmail.com>
homepage = https://dev.gajim.org/gajim/gajim-plugins/wikis/ChatstatePlugin
min_gajim_version: 1.0.0
max_gajim_version: 1.0.3
authors: Denis Fomin <fominde@gmail.com>
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/ChatstatePlugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Clickable Nicknames
short_name: clickable_nicknames
version: 0.7
version: 1.1.0
description: Clickable nicknames in the conversation textview.
authors: Andrey Musikhin <melomansegfault@gmail.com>
Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/ClickableNicknamesPlugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
......@@ -6,7 +6,7 @@ CLIENTS = {
'http://www.asterisk.org/xmpp/client/caps': ['asterisk.png', 'Asterisk'],
'http://ayttm.souceforge.net/caps': ['ayttm.png', 'Ayttm'],
'http://www.barobin.com/caps': ['bayanicq.png', 'Bayanicq'],
'http://bitlbee.org/xmpp/caps': ['bitlbee.png', 'Bitlbee'],
'http://bitlbee.org/xmpp/caps': ['bitlbee.png', 'BitlBee'],
'http://simpleapps.ru/caps#blacksmith': ['bot.png', 'Blacksmith'],
'http://blacksmith-2.googlecode.com/svn/': ['bot.png', 'Blacksmith-2'],
'http://jabber.pdg.pl/caps': ['bombus-klub.png', 'Bombus-klub'],
......@@ -26,8 +26,10 @@ CLIENTS = {
['coccinella.png', 'Coccinella'],
'http://conversations.im': ['conversations.png', 'Conversations'],
'Conversations Legacy': ['conversations-legacy.png', 'Conversations Legacy'],
'https://conversejs.org': ['conversejs.png', 'Converse'],
'http://digsby.com/caps': ['digsby.png', 'Digsby'],
'https://dino.im': ['dino.png', 'Dino'],
'http://emacs-jabber.sourceforge.net': ['emacs.png', 'Emacs Jabber client'],
'http://emess.eqx.su/caps': ['emess.png', 'Emess'],
'http://live.gnome.org/empathy/caps': \
['telepathy.freedesktop.org.png', 'Empathy'],
......@@ -100,7 +102,10 @@ CLIENTS = {
'http://pidgin.im/caps': ['pidgin.png', 'Pidgin'],
'http://pigeon.vpro.ru/caps': ['pigeon.png', 'Pigeon'],
'Pix-Art Messenger': ['pixart.png', 'Pix-Art Messenger'],
'http://jabber.pix-art.de': ['pixart.png', 'Pix-Art Messenger'],
'httр://sleekxmpp.com/ver/1.1.11': ['poezio.png', 'Poezio'],
'https://poez.io': ['poezio.png', 'Poezio'],
'http://www.profanity.im': ['profanity.png', 'Profanity'],
'http://psi-im.org/caps': ['psi.png', 'Psi'],
'http://psi-plus.com': ['psiplus.png', 'Psi+'],
'http://psi-dev.googlecode.com/caps': ['psiplus.png', 'Psi+'],
......@@ -144,8 +149,10 @@ CLIENTS = {
'http://witcher-team.ucoz.ru/': ['bot.png', 'Witcher'],
'http://online.yandex.ru/caps': ['yaonline.png', 'Yaonline'],
'http://www.igniterealtime.org/projects/smack/': ['xabber.png', 'Xabber'],
'https://www.xabber.com/': ['xabber.png', 'Xabber'],
'http://www.xfire.com/': ['xfire.png', 'Xfire'],
'http://www.xfire.com/caps': ['xfire.png', 'Xfire'],
'https://www.yaxim.org/': ['yaxim.png', 'Yaxim'],
'http://xu-6.jabbrik.ru/caps': ['bot.png', 'XU-6'],
}
LIBPURPLE_CLIENTS = {
......
[info]
name: Clients icons
short_name: clients_icons
version: 7.3
version: 7.3.21
description: Shows client icons in roster and in groupchats.
authors: Denis Fomin <fominde@gmail.com>
Artem Klyop <art.klyop@gmail.com>
Thilo Molitor <thilo@eightysoft.de>
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/ClientsIconsPlugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Flashing Keyboard
short_name: flashing_keyboard
version: 0.5
version: 1.1.0
description: Flashing keyboard led when there are unread messages.
authors: Denis Fomin <fominde@gmail.com>
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/flashingkeyboardplugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
name: python3-pillow
ensure-writable:
- easy-install.pth
buildsystem: simple
build-commands:
- install -d ${FLATPAK_DEST}/lib/python3.7/site-packages/
- python3 setup.py install --prefix=${FLATPAK_DEST}
- pip3 install --prefix=${FLATPAK_DEST} .
sources:
- type: archive
url: https://files.pythonhosted.org/packages/1b/e1/1118d60e9946e4e77872b69c58bc2f28448ec02c99a2ce456cd1a272c5fd/Pillow-5.3.0.tar.gz
......
......@@ -23,25 +23,20 @@ modules:
sha256: 196d3a80f93c537f27d2a19a4fafb826fb4c331b0b99110f985119391d170f96
- name: python3-axolotl-curve25519
ensure-writable:
- easy-install.pth
buildsystem: simple
build-commands:
- install -d ${FLATPAK_DEST}/lib/python3.7/site-packages/
- python3 setup.py install --prefix=${FLATPAK_DEST}
- pip3 install --prefix=${FLATPAK_DEST} .
sources:
- type: archive
url: https://files.pythonhosted.org/packages/59/ca/c8111718bcc8da18e9b9868e784293232a58c57159a5ea18f00ee967258f/python-axolotl-curve25519-0.4.1.post2.tar.gz
sha256: 0705a66297ebd2f508a60dc94e22881c754301eb81db93963322f6b3bdcb63a3
- name: python3-axolotl
ensure-writable:
- easy-install.pth
- setuptools.pth
buildsystem: simple
build-commands:
- install -d ${FLATPAK_DEST}/lib/python3.7/site-packages/
- python3 setup.py install --prefix=${FLATPAK_DEST}
- pip3 install --prefix=${FLATPAK_DEST} .
sources:
- type: archive
url: https://files.pythonhosted.org/packages/27/99/3b905f0061aba53526408d286e53cee3b00c9fd256eed7d21d5d41033690/python-axolotl-0.1.42.tar.gz
......@@ -66,8 +61,8 @@ modules:
- appstream-compose --basename=org.gajim.Gajim.Plugin.omemo --prefix=${FLATPAK_DEST} --origin=flatpak org.gajim.Gajim.Plugin.omemo
sources:
- type: archive
url: https://ftp.gajim.org/plugins_releases/omemo_2.6.1.zip
sha256: 52900457b10c55c2a7e4f67bb17861a1d769f909819e464fc3503842defb4b7f
url: https://ftp.gajim.org/plugins_releases/omemo_2.6.23.zip
sha256: ea0eb752637b34e1d19cc061a7aed614cf6747df3e83a6aa261d5ab6985e9f8c
- type: file
path: org.gajim.Gajim.Plugin.omemo.metainfo.xml
sha256: d7ef976ee4239d5c6b0da7b5e3bcc85d99db7d860c0329347a9522e8a176c69e
<?xml version="1.0" encoding="UTF-8"?>
<component type="addon">
<id>org.gajim.Gajim.Plugin.pgp</id>
<extends>org.gajim.Gajim.desktop</extends>
<name>PGP Plugin</name>
<summary>XMPP Extension Protocol (XEP) for secure multi-client end-to-end encryption</summary>
<url type="homepage">https://gajim.org/</url>
<metadata_license>CC-BY-SA-3.0</metadata_license>
<project_license>GPL-3.0</project_license>
<update_contact>gajim-devel_AT_gajim.org</update_contact>
</component>
id: org.gajim.Gajim.Plugin.pgp
runtime: org.gajim.Gajim
sdk: org.gnome.Sdk//3.30
build-extension: true
separate-locales: false
appstream-compose: false
build-options:
env:
PYTHONPATH: /app/plugins/pgp/lib/python3.7/site-packages/
modules:
- name: python3-python-gnupg
buildsystem: simple
build-commands:
- install -d ${FLATPAK_DEST}/lib/python3.7/site-packages/
- pip3 install --prefix=${FLATPAK_DEST} python_gnupg-0.4.3-py2.py3-none-any.whl
sources:
- type: file
url: https://files.pythonhosted.org/packages/4a/87/76ead690afc4c7710012ede242537cd9807dde9de6299e65d075925c0b02/python_gnupg-0.4.3-py2.py3-none-any.whl
sha256: faa69bab58ed0936f0ccf96c99b92369b7a1819305d37dfe5c927d21a437a09d
- name: gajim-pgp
buildsystem: simple
build-commands:
- 'cp -R -t ${FLATPAK_DEST} *'
post-install:
- install -Dm644 --target-directory=${FLATPAK_DEST}/share/metainfo org.gajim.Gajim.Plugin.pgp.metainfo.xml
- appstream-compose --basename=org.gajim.Gajim.Plugin.pgp --prefix=${FLATPAK_DEST} --origin=flatpak org.gajim.Gajim.Plugin.pgp
sources:
- type: archive
url: https://ftp.gajim.org/plugins_releases/pgp_1.2.22.zip
sha256: 5782c958690e3a985ed9ec82d92ee63039b3844b190f1291acb6249f7412b1b8
- type: file
path: org.gajim.Gajim.Plugin.pgp.metainfo.xml
sha256: cda6e41cdff3f7ff98136721a522305046714343236f9eb54b3e4cba5ccb34ad
......@@ -21,8 +21,8 @@ modules:
- appstream-compose --basename=org.gajim.Gajim.Plugin.url_image_preview --prefix=${FLATPAK_DEST} --origin=flatpak org.gajim.Gajim.Plugin.url_image_preview
sources:
- type: archive
url: https://ftp.gajim.org/plugins_releases/url_image_preview_2.3.1.zip
sha256: b90d50f5e7aaa46f8eff8bf531a98f208e48e771ac81b3d36a23d44ae13a0500
url: https://ftp.gajim.org/plugins_releases/url_image_preview_2.3.21.zip
sha256: 93a2a6bf3f335f0dc1eafac5a8813118c514a66e600ce7c9db91e293db88087c
- type: file
path: org.gajim.Gajim.Plugin.url_image_preview.metainfo.xml
sha256: 3b11c6bcb9c349bb6b831031da6740f5da6fc1e925ab98c5c06a62d787ca26fc
[info]
name: GUI For Me
short_name: gui_for_me
version: 0.5
version: 1.1.0
description: Adds a button for the '/me' command.
authors: BomberMan
copper
Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/GUIForMePlugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
import os
import dbus
import datetime as dt
import logging
from gi.repository import GObject
......@@ -10,13 +11,11 @@ from gajim.common import dbus_support
from gajim.plugins import GajimPlugin
from gajim.plugins.helpers import log_calls
from gajim.common.pep import ACTIVITIES
from gajim.plugins.plugins_i18n import _
from gajim.common.const import ACTIVITIES
log = logging.getLogger('gajim.p.hamster')
# Since Gajim 1.1.0 _() has to be imported
try:
from gajim.common.i18n import _
except ImportError:
pass
HAMSTAER_INTERFACE = 'org.gnome.Hamster'
SUBACTIVITIES = []
......@@ -31,9 +30,8 @@ class HamsterIntegrationPlugin(GajimPlugin):
@log_calls('HamsterIntegrationPlugin')
def init(self):
self.description = _('Integration with project hamster\n'
'see https://trac.gajim.org/ticket/6993\n'
'and http://projecthamster.wordpress.com/about/')
self.description = _('Integration with project hamster, see '
'http://projecthamster.org/')
self.config_dialog = None
self.events_handlers = {}
if os.name == 'nt':
......@@ -50,7 +48,7 @@ class HamsterIntegrationPlugin(GajimPlugin):
self.session_presence = self.bus.get_object(HAMSTAER_INTERFACE,
'/org/gnome/Hamster')
except:
app.log.debug('Hamster D-Bus service not found')
log.debug('Hamster D-Bus service not found')
return
self.bus.add_signal_receiver(self.hamster_facts_changed, 'FactsChanged',
......@@ -79,7 +77,7 @@ class HamsterIntegrationPlugin(GajimPlugin):
for account in accounts:
if app.account_is_connected(account):
connection = app.connections[account]
connection.retract_activity()
connection.get_module('UserActivity').send(None)
return
last_fact = self.from_dbus_fact(facts[-1])
......@@ -98,8 +96,8 @@ class HamsterIntegrationPlugin(GajimPlugin):
for account in app.connections:
if app.account_is_connected(account):
connection = app.connections[account]
connection.send_activity(activity, subactivity,
last_fact['fact'])
connection.get_module('UserActivity').send(
(activity, subactivity, last_fact['fact']))
def from_dbus_fact(self, fact):
'''unpack the struct into a proper dict'''
......
[info]
name: Hamster integration
short_name: hamster_integration
version: 0.1.5
description: Integration with project hamster
see https://trac.gajim.org/ticket/6993
and http://projecthamster.wordpress.com/about/
short_name: hamster
version: 1.1.3
description: Integration with project hamster, see http://projecthamster.org/
authors: Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/
min_gajim_version: 1.0.0
homepage: https://dev.gajim.org/gajim/gajim-plugins/wikis/hamsterintegrationplugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Image
short_name: image
version: 1.1
version: 1.1.20
description: This plugin is designed to send a small(0 - 40 kb) graphic image to your contact.
Client on the other side must support XEP-0071: XHTML-IM and maintain the scheme data: URI.
Psi+ and Jabbim supported this.
authors: Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/ImagePlugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Juick
short_name: Juick
version: 0.9.9
short_name: juick
version: 1.1.1
description: Clickable Juick links , Juick nicks, preview Juick picturs.
The key combination alt + up in the textbox allow insert the number of last message (comment or topic).
authors: Denis Fomin <fominde@gmail.com>
evgen <drujebober@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/JuickPlugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Latex
short_name: latex
version: 0.4.0
version: 1.1.0
description: render received latex code
authors: Yves Fischer <yvesf@xapek.org>
Yann Leboulanger <asterix@lagaule.org>
homepage: http://trac-plugins.gajim.org/wiki/LatexPlugin
min_gajim_version: 1.0.0
max_gajim_version: 1.0.3
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Message Length Notifier
short_name: length_notifier
version: 0.5
version: 1.1.0
description: Highlights message entry field in chat window when given length of message is exceeded.
authors = Mateusz Biliński <mateusz@bilinski.it>
homepage = http://trac-plugins.gajim.org/wiki/LengthNotifierPlugin
min_gajim_version: 1.0.0
authors: Mateusz Biliński <mateusz@bilinski.it>
homepage: http://trac-plugins.gajim.org/wiki/LengthNotifierPlugin
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
[info]
name: Message Box Size
short_name: message_box_size
version: 0.5
version: 1.1.0
description: Allows you to adjust the height of the new message input field.
authors: Denis Fomin <fominde@gmail.com>
homepage: http://trac-plugins.gajim.org/wiki/MessageBoxSizePlugin
min_gajim_version: 1.0.0
min_gajim_version: 1.0.99
max_gajim_version: 1.1.90
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.4 -->
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.0"/>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="config_window">
<property name="width_request">400</property>
<property name="height_request">-1</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Now Listen Configuration</property>
<child type="titlebar">
<placeholder/>
</child>
<child>
<object class="GtkBox" id="now_listen_config">
<property name="visible">True</property>
......@@ -13,145 +18,89 @@
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="border_width">18</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<property name="spacing">6</property>
<child>
<object class="GtkBox">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Format string:&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>