diff options
author | Yann Leboulanger <asterix@lagaule.org> | 2018-10-11 14:06:47 +0300 |
---|---|---|
committer | Yann Leboulanger <asterix@lagaule.org> | 2018-10-11 14:06:47 +0300 |
commit | 6c4b727c5102738aa46c8dcafa19a64c3277dc0e (patch) | |
tree | d045791798a10af861619e3e9d48938c4a329114 | |
parent | caf72836a782967694210debaecbcaf4b22450f3 (diff) |
Revert "[birthday] Rewrite Plugin"
This reverts commit 88dd843c4281fe20dc7416dcd919178a49e5c9c6.
# Conflicts:
# birthday_reminder/manifest.ini
# birthday_reminder/plugin.py
-rw-r--r-- | birthday_reminder/birthday_reminder_large.png | bin | 0 -> 6998 bytes | |||
-rw-r--r-- | birthday_reminder/manifest.ini | 5 | ||||
-rw-r--r-- | birthday_reminder/plugin.py | 188 |
3 files changed, 95 insertions, 98 deletions
diff --git a/birthday_reminder/birthday_reminder_large.png b/birthday_reminder/birthday_reminder_large.png Binary files differnew file mode 100644 index 0000000..d150022 --- /dev/null +++ b/birthday_reminder/birthday_reminder_large.png diff --git a/birthday_reminder/manifest.ini b/birthday_reminder/manifest.ini index b9d7ca5..5a24539 100644 --- a/birthday_reminder/manifest.ini +++ b/birthday_reminder/manifest.ini @@ -1,9 +1,8 @@ [info] name: Birthday reminder short_name: birthday_reminder -version: 1.0.1 +version: 0.0.5 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 +min_gajim_version: 0.16.11 diff --git a/birthday_reminder/plugin.py b/birthday_reminder/plugin.py index f403f5b..7fe2cb8 100644 --- a/birthday_reminder/plugin.py +++ b/birthday_reminder/plugin.py @@ -1,121 +1,119 @@ import os -import json +import glob import datetime -import logging - -from gi.repository import GLib +from xml.dom.minidom import * +from gi.repository import GObject from gajim.plugins import GajimPlugin +from gajim.plugins.helpers import log_calls +from gajim.notify import popup 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 - -log = logging.getLogger('gajim.plugin_system.birthday') - -TITLE = _('%s has birthday today') -TEXT = _('Send him a message') - class BirthDayPlugin(GajimPlugin): + + @log_calls('BirthDayPlugin') def init(self): + self.config_dialog = None self.description = ('Birthday reminder plugin') self.events_handlers = { - 'vcard-received': (ged.GUI2, self._vcard_received)} - - self.timeout_id = None - self._timeout_id_start = None - + '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 = [] - self._birthdays = {} - self._load_birthdays() + def check_birthdays(self, account=None): + def show_popup(account, jid): + contact_instances = app.contacts.get_contacts(account, jid) + contact = app.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, type_='', + path_to_image=image, title=title, text=text + ' ' + nick) - def activate(self): - self._timeout_id_start = GLib.timeout_add_seconds( - 5, self._check_birthdays_at_start) - self._timeout_id = GLib.timeout_add_seconds( - 86400, self._check_birthdays) + accounts = app.contacts.get_accounts() + vcards = [] + date_dict = {} + for jid in glob.glob(self.vcard_path + '*@*'): + if os.path.isfile(jid): + vcards.append(jid) - def deactivate(self): - if self._timeout_id is not None: - GLib.source_remove(self.timeout_id) - if self._timeout_id_start is not None: - GLib.source_remove(self._timeout_id_start) - - def _load_birthdays(self): - path = os.path.join(configpaths.get('MY_DATA'), 'birthdays.json') - if os.path.exists(path): - with open(path, 'r', encoding='utf-8') as file: - content = file.read() - if content: - self._birthdays = json.loads(content) - - def _store_birthdays(self): - path = os.path.join(configpaths.get('MY_DATA'), 'birthdays.json') - with open(path, 'w', encoding='utf-8') as file: - json.dump(self._birthdays, file) - - def _vcard_received(self, event): - birthday = event.vcard_dict.get('BDAY') - if not birthday: - if event.jid in self._birthdays: - del self._birthdays[event.jid] - log.info('Received empty birthday: %s', event.jid) - else: + for xmldoc in vcards: try: - year, month, day = birthday.split('-') - year = int(year) - month = int(month) - day = int(day) - except Exception: - log.warning('Invalid date: %s', birthday) - if event.jid in self._birthdays: - del self._birthdays[event.jid] + xml = parse(xmldoc) + except: + pass else: - self._birthdays[event.jid] = (year, month, day) - log.info('Received birthday: %s %s', - event.jid, (year, month, day)) - self._store_birthdays() - - def _check_birthdays_at_start(self): - self._check_birthdays() + 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 - def _check_birthdays(self): - log.info('Check birthdays...') today = datetime.date.today() - for jid, birthdate in self._birthdays.items(): - year, month, day = birthdate - if today.month == month and today.day == day: - account, contact = self._find_contact(jid) - if contact is None: - if jid in self._birthdays: - del self._birthdays[jid] - self._store_birthdays() - continue - else: - log.info('Issue notification for %s', jid) - nick = contact.get_shown_name() or jid - app.notification.popup( - 'reminder', - jid, - account, - icon_name='trophy-gold', - title=TITLE % GLib.markup_escape_text(nick), - text=TEXT) + for key, value in date_dict.items(): + 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 - def _find_contact(self, jid): - accounts = app.contacts.get_accounts() - for account in accounts: - contact = app.contacts.get_contacts(account, jid) - if contact is not None: - return account, contact[0] + @log_calls('BirthDayPlugin') + def activate(self): + 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) |