From 027fd63fd27fd64e4db99bdb09f04cb658c6068a Mon Sep 17 00:00:00 2001 From: Denis Fomin <fominde@gmail.com> Date: Wed, 16 Jan 2013 16:29:25 +0400 Subject: [PATCH] UrlShortenerPlugin.shortening links in outgoing message --- url_shortener/config_dialog.ui | 55 ++++++++++++++++++++++---------- url_shortener/manifest.ini | 4 +-- url_shortener/url_shortener.py | 58 ++++++++++++++++++++++++++++------ 3 files changed, 90 insertions(+), 27 deletions(-) diff --git a/url_shortener/config_dialog.ui b/url_shortener/config_dialog.ui index ea1f014d..a700e4d5 100644 --- a/url_shortener/config_dialog.ui +++ b/url_shortener/config_dialog.ui @@ -4,35 +4,58 @@ <!-- interface-naming-policy toplevel-contextual --> <object class="GtkWindow" id="window1"> <child> - <object class="GtkHBox" id="hbox1"> + <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="extension_events">all</property> + <property name="orientation">vertical</property> <child> - <object class="GtkLabel" id="avatar_size_lebel"> + <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> - <property name="xalign">0.029999999329447746</property> - <property name="label" translatable="yes">The maximum length not be shortened links(chars)</property> - <property name="track_visited_links">False</property> + <property name="extension_events">all</property> + <child> + <object class="GtkLabel" id="avatar_size_lebel"> + <property name="visible">True</property> + <property name="xalign">0.029999999329447746</property> + <property name="label" translatable="yes">The maximum length not be shortened links(chars)</property> + <property name="track_visited_links">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="max_chars"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="width_chars">6</property> + <property name="snap_to_ticks">True</property> + <property name="numeric">True</property> + <signal name="value_changed" handler="avatar_size_value_changed"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkSpinButton" id="max_chars"> + <object class="GtkCheckButton" id="shorten_outgoing"> + <property name="label" translatable="yes">shorten links in outgoing messages</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="invisible_char">●</property> - <property name="width_chars">6</property> - <property name="snap_to_ticks">True</property> - <property name="numeric">True</property> - <signal name="value_changed" handler="avatar_size_value_changed"/> + <property name="receives_default">False</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="shorten_outgoing_toggled"/> </object> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">1</property> </packing> </child> diff --git a/url_shortener/manifest.ini b/url_shortener/manifest.ini index 7c3f2115..0963c44b 100644 --- a/url_shortener/manifest.ini +++ b/url_shortener/manifest.ini @@ -1,8 +1,8 @@ [info] name: Url Shortener short_name: url_shortener -version: 0.1 -description: Plugin that allows users to shorten a long URL in received messages. +version: 0.2 +description: Plugin that allows users to shorten a long URL in messages. For example, you can turn this link: http://maps.google.com/maps?f=d&saddr=New+York+Penn+Station&daddr=9th+Ave+%26+14th+St,+New+York,+NY&hl=en&geocode=&mra=ls&dirflg=r&date=11%2F12%2F08&time=4:13pm&ttype=dep&noexp=0&noal=0&sort=&sll=40.746175,-73.998395&sspn=0.014468,0.036392&ie=UTF8&z=14 Into this link: diff --git a/url_shortener/url_shortener.py b/url_shortener/url_shortener.py index d97bec77..804950c2 100644 --- a/url_shortener/url_shortener.py +++ b/url_shortener/url_shortener.py @@ -5,10 +5,14 @@ import json import urllib import urllib2 from common import gajim +from common import ged from plugins import GajimPlugin from plugins.helpers import log_calls from plugins.gui import GajimPluginConfigDialog +APIKEY = 'R_fcba926fc7978bd19acbca73ec82b2be' +USER = 'dicson' + class UrlShortenerPlugin(GajimPlugin): @log_calls('UrlShortenerPlugin') def init(self): @@ -28,10 +32,42 @@ class UrlShortenerPlugin(GajimPlugin): 'print_special_text': (self.print_special_text, self.print_special_text1),} self.config_default_values = { - 'MAX_CHARS': (50, _('MAX_CHARS(30-...)'))} + 'MAX_CHARS': (50, _('MAX_CHARS(30-...)')), + 'SHORTEN_OUTGOING': (False, ''),} + self.events_handlers['message-outgoing'] = (ged.OUT_PRECORE, + self.handle_outgoing_msg) self.chat_control = None self.controls = [] + def handle_outgoing_msg(self, event): + if not event.message: + return + if not self.config['SHORTEN_OUTGOING']: + return + + iterator = gajim.interface.basic_pattern_re.finditer(event.message) + for match in iterator: + start, end = match.span() + link = event.message[start:end] + if len(link) < self.config['MAX_CHARS']: + continue + short_link = None + try: + params = urllib.urlencode({'longUrl': link, + 'login': USER, + 'apiKey': APIKEY, + 'format': 'json'}) + req = urllib2.Request('http://api.bit.ly/v3/shorten?%s' % params) + response = urllib2.urlopen(req) + j = json.load(response) + if j['status_code'] == 200: + short_link = j['data']['url'] + except urllib2.HTTPError, e: + pass + if short_link: + event.message = event.message.replace(link, short_link) + event.callback_args[1] = event.message + @log_calls('UrlShortenerPlugin') def connect_with_chat_control(self, chat_control): self.chat_control = chat_control @@ -59,8 +95,6 @@ class UrlShortenerPlugin(GajimPlugin): class Base(object): def __init__(self, plugin, chat_control): - self.user = 'dicson' - self.apikey = 'R_fcba926fc7978bd19acbca73ec82b2be' self.plugin = plugin self.chat_control = chat_control self.textview = self.chat_control.conv_textview @@ -99,8 +133,8 @@ class Base(object): def insert_hyperlink(self, mark, special_text, ttt): try: params = urllib.urlencode({'longUrl': special_text, - 'login': self.user, - 'apiKey': self.apikey, + 'login': USER, + 'apiKey': APIKEY, 'format': 'json'}) req = urllib2.Request('http://api.bit.ly/v3/shorten?%s' % params) response = urllib2.urlopen(req) @@ -132,8 +166,8 @@ class Base(object): if text.startswith('http://bit.ly/'): try: params = urllib.urlencode({'shortUrl': text, - 'login': self.user, - 'apiKey': self.apikey, + 'login': USER, + 'apiKey': APIKEY, 'format': 'json'}) req = urllib2.Request('http://api.bit.ly/v3/expand?%s' \ % params) @@ -161,17 +195,23 @@ class UrlShortenerPluginConfigDialog(GajimPluginConfigDialog): 'config_dialog.ui') self.xml = gtk.Builder() self.xml.set_translation_domain('gajim_plugins') - self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, ['hbox1']) + self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, ['vbox1']) self.max_chars_spinbutton = self.xml.get_object('max_chars') self.max_chars_spinbutton.get_adjustment().set_all(30, 30, 99999, 1, 10, 0) - hbox = self.xml.get_object('hbox1') + self.shorten_outgoing = self.xml.get_object('shorten_outgoing') + print self.shorten_outgoing + hbox = self.xml.get_object('vbox1') self.child.pack_start(hbox) self.xml.connect_signals(self) def on_run(self): self.max_chars_spinbutton.set_value(self.plugin.config['MAX_CHARS']) + self.shorten_outgoing.set_active(self.plugin.config['SHORTEN_OUTGOING']) def avatar_size_value_changed(self, spinbutton): self.plugin.config['MAX_CHARS'] = spinbutton.get_value() + + def shorten_outgoing_toggled(self, checkbutton): + self.plugin.config['SHORTEN_OUTGOING'] = checkbutton.get_active() -- GitLab