Autocompletion for users has been implemented

This commit is contained in:
Manuel Cortez 2014-11-25 12:30:00 -06:00
parent 0104b97df0
commit 3ec8ac31a5
11 changed files with 168 additions and 2 deletions

View File

@ -68,6 +68,7 @@ class audioDialog(wx.Dialog):
services = [] services = []
if config.main["services"]["dropbox_token"] != "": if config.main["services"]["dropbox_token"] != "":
services.append("Dropbox") services.append("Dropbox")
service.append("TwUp")
services.append("SNDUp") services.append("SNDUp")
return services return services

View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
import storage
import output
import wx_menu
class autocompletionUsers(object):
def __init__(self, window):
super(autocompletionUsers, self).__init__()
self.window = window
def show_menu(self):
position = self.window.text.GetInsertionPoint()
text = self.window.text.GetValue()
text = text[:position]
try:
pattern = text.split()[-1]
except IndexError:
output.speak(_(u"You have to start to write"))
return
if pattern.startswith("@") == True:
db = storage.storage()
menu = wx_menu.menu(self.window.text, pattern[1:])
users = db.get_users(pattern[1:])
if len(users) > 0:
menu.append_options(users)
self.window.PopupMenu(menu, self.window.text.GetPosition())
menu.Destroy()
else:
output.speak(_(u"There is not results in your users database"))
else:
output.speak(_(u"Autocompletion only works for users."))

View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
import storage
import wx
import wx_settings
import output
from mysc.thread_utils import call_threaded
class autocompletionSettings(object):
def __init__(self, window):
super(autocompletionSettings, self).__init__()
self.window = window
self.dialog = wx_settings.autocompletionSettingsDialog()
if self.dialog.ShowModal() == wx.ID_OK:
call_threaded(self.add_users_to_database)
def add_users_to_database(self):
output.speak(_(u"Updating database... You can close this window now. A message will tell you when the process finishes."))
database = storage.storage()
if self.dialog.followers_buffer.GetValue() == True:
buffer = self.window.search_buffer("people", "followers")
for i in buffer.db.settings[buffer.name_buffer]:
database.set_user(i["screen_name"], i["name"])
if self.dialog.friends_buffer.GetValue() == True:
buffer = self.window.search_buffer("people", "friends")
for i in buffer.db.settings[buffer.name_buffer]:
database.set_user(i["screen_name"], i["name"])
wx_settings.show_success_dialog()
self.dialog.Destroy()

View File

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
import sqlite3, paths
from sessionmanager import manager
class storage(object):
def __init__(self):
self.connection = sqlite3.connect(paths.config_path("%s/autocompletionUsers.dat" % (manager.manager.get_current_session())))
self.cursor = self.connection.cursor()
if self.table_exist("users") == False:
self.create_table()
def table_exist(self, table):
ask = self.cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='%s'" % (table))
answer = ask.fetchone()
if answer == None:
return False
else:
return True
def get_users(self, term):
self.cursor.execute("""SELECT * FROM users WHERE user LIKE ?""", ('{}%'.format(term),))
return self.cursor.fetchall()
def set_user(self, screen_name, user_name):
self.cursor.execute("""insert or ignore into users values(?, ?)""", (screen_name, user_name))
self.connection.commit()
def remove_user(self, user):
self.cursor.execute("""DELETE FROM users WHERE user = ?""", (user,))
return self.cursor.fetchone()
def create_table(self):
self.cursor.execute("""
create table users(
user TEXT UNIQUE,
name TEXT
)""")
def __del__(self):
self.cursor.close()
self.connection.close()

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
import wx
class menu(wx.Menu):
def __init__(self, window, pattern):
super(menu, self).__init__()
self.window = window
self.pattern = pattern
def append_options(self, options):
for i in options:
item = wx.MenuItem(self, wx.NewId(), "%s (@%s)" % (i[1], i[0]))
self.AppendItem(item)
self.Bind(wx.EVT_MENU, lambda evt, temp=i[0]: self.select_text(evt, temp), item)
def select_text(self, ev, text):
self.window.ChangeValue(self.window.GetValue().replace(self.pattern, text+" "))
self.window.SetInsertionPointEnd()

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
import wx
class autocompletionSettingsDialog(wx.Dialog):
def __init__(self):
super(autocompletionSettingsDialog, self).__init__(parent=None, id=-1, title=_(u"Autocompletion settings"))
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
self.followers_buffer = wx.CheckBox(panel, -1, _(u"Add users from followers buffer"))
self.friends_buffer = wx.CheckBox(panel, -1, _(u"Add users from friends buffer"))
sizer.Add(self.followers_buffer, 0, wx.ALL, 5)
sizer.Add(self.friends_buffer, 0, wx.ALL, 5)
ok = wx.Button(panel, wx.ID_OK)
cancel = wx.Button(panel, wx.ID_CANCEL)
sizerBtn = wx.BoxSizer(wx.HORIZONTAL)
sizerBtn.Add(ok, 0, wx.ALL, 5)
sizer.Add(cancel, 0, wx.ALL, 5)
sizer.Add(sizerBtn, 0, wx.ALL, 5)
panel.SetSizer(sizer)
self.SetClientSize(sizer.CalcMin())
def show_success_dialog():
wx.MessageDialog(None, _(u"Users TwBlue-database has been updated with new users."), _(u"Done"), wx.OK).ShowModal()

View File

@ -29,6 +29,7 @@ import webbrowser
import paths import paths
import platform import platform
from mysc import restart from mysc import restart
from extra.autocompletionUsers import settings
log = original_logger.getLogger("configuration") log = original_logger.getLogger("configuration")
system = platform.system() system = platform.system()
@ -50,6 +51,8 @@ class general(wx.Panel):
langBox.Add(language, 0, wx.ALL, 5) langBox.Add(language, 0, wx.ALL, 5)
langBox.Add(self.language, 0, wx.ALL, 5) langBox.Add(self.language, 0, wx.ALL, 5)
sizer.Add(langBox, 0, wx.ALL, 5) sizer.Add(langBox, 0, wx.ALL, 5)
self.au = wx.Button(self, -1, u"Configure autocompltion")
# self.Bind(wx.EVT_BUTTON, self.autocompletion, au)
self.ask_at_exit = wx.CheckBox(self, -1, _(U"ask before exiting TwBlue?")) self.ask_at_exit = wx.CheckBox(self, -1, _(U"ask before exiting TwBlue?"))
self.ask_at_exit.SetValue(config.main["general"]["ask_at_exit"]) self.ask_at_exit.SetValue(config.main["general"]["ask_at_exit"])
sizer.Add(self.ask_at_exit, 0, wx.ALL, 5) sizer.Add(self.ask_at_exit, 0, wx.ALL, 5)
@ -84,6 +87,7 @@ class general(wx.Panel):
sizer.Add(self.reverse_timelines, 0, wx.ALL, 5) sizer.Add(self.reverse_timelines, 0, wx.ALL, 5)
self.SetSizer(sizer) self.SetSizer(sizer)
class other_buffers(wx.Panel): class other_buffers(wx.Panel):
def __init__(self, parent): def __init__(self, parent):
wx.Panel.__init__(self, parent) wx.Panel.__init__(self, parent)
@ -264,6 +268,7 @@ class configurationDialog(wx.Dialog):
self.general = general(notebook) self.general = general(notebook)
notebook.AddPage(self.general, _(u"General")) notebook.AddPage(self.general, _(u"General"))
self.general.SetFocus() self.general.SetFocus()
self.Bind(wx.EVT_BUTTON, self.autocompletion, self.general.au)
self.buffers = other_buffers(notebook) self.buffers = other_buffers(notebook)
notebook.AddPage(self.buffers, _(u"Show other buffers")) notebook.AddPage(self.buffers, _(u"Show other buffers"))
self.ignored_clients = ignoredClients(notebook) self.ignored_clients = ignoredClients(notebook)
@ -285,6 +290,9 @@ class configurationDialog(wx.Dialog):
panel.SetSizer(sizer) panel.SetSizer(sizer)
self.SetClientSize(sizer.CalcMin()) self.SetClientSize(sizer.CalcMin())
def autocompletion(self, ev):
configuration = settings.autocompletionSettings(self.parent)
def check_followers_change(self): def check_followers_change(self):
if self.buffers.followers.GetValue() != self.buffers.followers_value: if self.buffers.followers.GetValue() != self.buffers.followers_value:
if self.buffers.followers.GetValue() == True: if self.buffers.followers.GetValue() == True:

View File

@ -30,6 +30,7 @@ from twython import TwythonError
from extra import translator, AudioUploader from extra import translator, AudioUploader
import platform import platform
from extra.AudioUploader import transfer from extra.AudioUploader import transfer
from extra.autocompletionUsers import completion
if platform.system() != "Darwin": if platform.system() != "Darwin":
from extra.AudioUploader import dropbox_transfer from extra.AudioUploader import dropbox_transfer
from extra.SpellChecker import gui as spellCheckerGUI from extra.SpellChecker import gui as spellCheckerGUI
@ -183,6 +184,8 @@ class tweet(textLimited):
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize) self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize)
self.okButton.Bind(wx.EVT_BUTTON, self.onSend) self.okButton.Bind(wx.EVT_BUTTON, self.onSend)
self.okButton.SetDefault() self.okButton.SetDefault()
autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users"))
self.Bind(wx.EVT_BUTTON, self.autocompletion, autocompletionButton)
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize)
cancelButton.Bind(wx.EVT_BUTTON, self.onCancel) cancelButton.Bind(wx.EVT_BUTTON, self.onCancel)
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
@ -202,8 +205,11 @@ class tweet(textLimited):
self.mainBox.Add(self.ok_cancelSizer) self.mainBox.Add(self.ok_cancelSizer)
selectId = wx.NewId() selectId = wx.NewId()
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
# autocompletionId = wx.NewId()
# self.Bind(wx.EVT_MENU, self.autocompletion, id=autocompletionId)
self.accel_tbl = wx.AcceleratorTable([ self.accel_tbl = wx.AcceleratorTable([
(wx.ACCEL_CTRL, ord('A'), selectId), (wx.ACCEL_CTRL, ord('A'), selectId),
#(wx.ACCEL_ALT, ord('A'), autocompletionId),
]) ])
self.SetAcceleratorTable(self.accel_tbl) self.SetAcceleratorTable(self.accel_tbl)
self.panel.SetSizer(self.mainBox) self.panel.SetSizer(self.mainBox)
@ -215,6 +221,10 @@ class tweet(textLimited):
self.onTimer(wx.EVT_CHAR_HOOK) self.onTimer(wx.EVT_CHAR_HOOK)
self.SetClientSize(self.mainBox.CalcMin()) self.SetClientSize(self.mainBox.CalcMin())
def autocompletion(self, event=None):
c = completion.autocompletionUsers(self)
c.show_menu()
def onUpload_image(self, ev): def onUpload_image(self, ev):
if self.upload_image.GetLabel() == _(u"Discard image"): if self.upload_image.GetLabel() == _(u"Discard image"):
self.image = None self.image = None

View File

@ -211,7 +211,7 @@ class mainFrame(wx.Frame):
self.Bind(wx.EVT_QUERY_END_SESSION, self.exit) self.Bind(wx.EVT_QUERY_END_SESSION, self.exit)
self.Bind(wx.EVT_END_SESSION, self.exit) self.Bind(wx.EVT_END_SESSION, self.exit)
log.debug(u"Creating the system tray icon... ") log.debug(u"Creating the system tray icon... ")
sysTray=sysTrayIcon.SysTrayIcon(self) self.sysTray=sysTrayIcon.SysTrayIcon(self)
panel = wx.Panel(self) panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer = wx.BoxSizer(wx.VERTICAL)
self.SetTitle("TW Blue") self.SetTitle("TW Blue")
@ -590,6 +590,7 @@ class mainFrame(wx.Frame):
def exit(self, event=None): def exit(self, event=None):
config.main.write() config.main.write()
log.debug("Exiting...") log.debug("Exiting...")
self.sysTray.RemoveIcon()
try: try:
self.check_streams.cancel() self.check_streams.cancel()
except AttributeError: except AttributeError:

View File

@ -25,6 +25,7 @@ class handler(BaseHTTPServer.BaseHTTPRequestHandler):
verifier = params.get('oauth_verifier', [None])[0] verifier = params.get('oauth_verifier', [None])[0]
self.wfile.write("You have successfully logged in to Twitter with TW Blue. " self.wfile.write("You have successfully logged in to Twitter with TW Blue. "
"You can close this window now.") "You can close this window now.")
self.wfile.close()
class twitter(object): class twitter(object):
@ -48,6 +49,8 @@ class twitter(object):
self.twitter = Twython(application.app_key, application.app_secret, auth['oauth_token'], auth['oauth_token_secret']) self.twitter = Twython(application.app_key, application.app_secret, auth['oauth_token'], auth['oauth_token_secret'])
final = self.twitter.get_authorized_tokens(verifier) final = self.twitter.get_authorized_tokens(verifier)
self.save_configuration(final["oauth_token"], final["oauth_token_secret"]) self.save_configuration(final["oauth_token"], final["oauth_token_secret"])
httpd.server_close()
def save_configuration(self, user_key=None, user_secret=None): def save_configuration(self, user_key=None, user_secret=None):
if user_key != None and user_secret != None: if user_key != None and user_secret != None: