136 lines
4.1 KiB
Python
136 lines
4.1 KiB
Python
import windows
|
|
import chaninfo
|
|
from conf import conf
|
|
|
|
def channel_completer(window, left, right, text):
|
|
if isinstance(window, windows.ChannelWindow):
|
|
yield window.id
|
|
|
|
for w in windows.get_with(wclass=windows.ChannelWindow, network=window.network):
|
|
if w is not window:
|
|
yield w.id
|
|
|
|
for w in windows.get_with(wclass=windows.ChannelWindow):
|
|
if w.network is not window.network:
|
|
yield w.id
|
|
|
|
# normal server commands
|
|
srv_commands = ('ping', 'join', 'part', 'mode', 'server', 'kick',
|
|
'quit', 'nick', 'privmsg', 'notice', 'topic')
|
|
|
|
def command_completer(window, left, right, text):
|
|
for c in srv_commands:
|
|
yield '/%s' % c
|
|
|
|
if 'CMDS' in window.network.isupport:
|
|
for c in window.network.isupport['CMDS'].split(','):
|
|
yield '/%s' % c.lower()
|
|
|
|
for c in core.events.all_events:
|
|
if c.startswith('Command') and c != 'Command':
|
|
yield '/%s' % c[7:].lower()
|
|
|
|
def nick_completer(window, left, right, text):
|
|
if type(window) == windows.QueryWindow:
|
|
yield window.id
|
|
|
|
recent_speakers = getattr(window, 'recent_speakers', ())
|
|
|
|
for nick in recent_speakers:
|
|
if chaninfo.ison(window.network, window.id, nick):
|
|
yield nick
|
|
|
|
for nick in chaninfo.nicks(window.network, window.id):
|
|
if nick not in recent_speakers:
|
|
yield nick
|
|
|
|
def script_completer(window, left, right, text):
|
|
return core.events.loaded.iterkeys()
|
|
|
|
def network_completer(window, left, right, text):
|
|
return conf.get('networks', {}).iterkeys()
|
|
|
|
def get_completer_for(window):
|
|
input = window.input
|
|
|
|
left, right = input.text[:input.cursor], input.text[input.cursor:]
|
|
|
|
text = left.split(' ')[-1]
|
|
|
|
while True:
|
|
suffix = ''
|
|
if text and text[0] in window.network.isupport.get('CHANTYPES', '#&+'):
|
|
candidates = channel_completer(window, left, right, text)
|
|
|
|
elif input.text.startswith('/reload '):
|
|
candidates = script_completer(window, left, right, text)
|
|
|
|
elif input.text.startswith('/edit '):
|
|
candidates = script_completer(window, left, right, text)
|
|
|
|
elif input.text.startswith('/server '):
|
|
candidates = network_completer(window, left, right, text)
|
|
|
|
elif text.startswith('/'):
|
|
candidates = command_completer(window, left, right, text)
|
|
suffix = ' '
|
|
|
|
else:
|
|
candidates = nick_completer(window, left, right, text)
|
|
|
|
if left == text:
|
|
suffix = ': '
|
|
else:
|
|
suffix = ' '
|
|
|
|
if text:
|
|
before = left[:-len(text)]
|
|
else:
|
|
before = left
|
|
|
|
insert_text = '%s%s%s%s' % (before, '%s', suffix, right)
|
|
cursor_pos = len(before + suffix)
|
|
|
|
original = window.input.text, window.input.cursor
|
|
|
|
for cand in candidates:
|
|
if cand.lower().startswith(text.lower()):
|
|
window.input.text, window.input.cursor = insert_text % cand, cursor_pos + len(cand)
|
|
yield None
|
|
|
|
window.input.text, window.input.cursor = original
|
|
yield None
|
|
|
|
# generator--use recent_completer.next() to continue cycling through whatever
|
|
recent_completer = None
|
|
|
|
def onKeyPress(e):
|
|
global recent_completer
|
|
|
|
if e.key == 'Tab':
|
|
if not recent_completer:
|
|
recent_completer = get_completer_for(e.window)
|
|
|
|
recent_completer.next()
|
|
|
|
else:
|
|
recent_completer = None
|
|
|
|
def onActive(e):
|
|
global recent_completer
|
|
|
|
recent_completer = None
|
|
|
|
def onText(e):
|
|
if chaninfo.ischan(e.network, e.target):
|
|
if not hasattr(e.window, 'recent_speakers'):
|
|
e.window.recent_speakers = []
|
|
|
|
for nick in e.window.recent_speakers:
|
|
if nick == e.source or not chaninfo.ison(e.network, e.target, nick):
|
|
e.window.recent_speakers.remove(nick)
|
|
|
|
e.window.recent_speakers.insert(0, e.source)
|
|
|
|
onAction = onText
|