147 lines
4.2 KiB
Python
147 lines
4.2 KiB
Python
import ui
|
|
import windows
|
|
import chaninfo
|
|
from conf import conf
|
|
|
|
def set_target(e):
|
|
target_l = e.target.lstrip('@+%.(<')
|
|
e._target_fr = e.target_fr + len(e.target) - len(target_l)
|
|
|
|
target_r = e.target.rstrip('>:,')
|
|
e._target_to = e.target_to - len(e.target) + len(target_r)
|
|
|
|
if target_r.endswith(')'):
|
|
e._target = e.text[e._target_fr:e._target_to]
|
|
open_parens = e._target.count('(') - e._target.count(')')
|
|
while open_parens < 0 and e.text[e._target_to-1] == ')':
|
|
e._target_to -= 1
|
|
open_parens += 1
|
|
|
|
e._target = e.text[e._target_fr:e._target_to]
|
|
|
|
def is_nick(e):
|
|
return isinstance(e.window, windows.ChannelWindow) and \
|
|
chaninfo.ison(e.window.network, e.window.id, e._target)
|
|
|
|
def is_url(e):
|
|
def starts(prefix, mindots=1):
|
|
def prefix_url(target):
|
|
return target.startswith(prefix) and target.count('.') >= mindots
|
|
|
|
return prefix_url
|
|
|
|
to_check = [starts(*x) for x in [
|
|
('http://', 1),
|
|
('https://', 1),
|
|
('ftp://', 1),
|
|
('www', 2),
|
|
]]
|
|
|
|
for check_url in to_check:
|
|
if check_url(e._target):
|
|
return True
|
|
|
|
return False
|
|
|
|
def is_chan(e):
|
|
# click on a #channel
|
|
return e.window.network and e._target and \
|
|
e._target[0] in e.window.network.isupport.get('CHANTYPES', '&#$+')
|
|
|
|
def get_autojoin_list(network):
|
|
perform = conf.get('networks',{}).get(network.name,{}).get('perform',())
|
|
channels = set()
|
|
for line in perform:
|
|
if line.startswith('join ') and ' ' not in line[5:]:
|
|
channels.update(line[5:].split(','))
|
|
return channels
|
|
|
|
def add_autojoin(network, channel):
|
|
if 'networks' not in conf:
|
|
conf['networks'] = {}
|
|
if network.name not in conf['networks']:
|
|
conf['networks'][network.name] = {'server': network.server}
|
|
conf['start_networks'] = conf.get('start_networks',[]) + [network.name]
|
|
if 'perform' in conf['networks'][network.name]:
|
|
perform = conf['networks'][network.name]['perform']
|
|
else:
|
|
perform = conf['networks'][network.name]['perform'] = []
|
|
|
|
for n, line in enumerate(perform):
|
|
if line.startswith('join ') and ' ' not in line[5:]:
|
|
perform[n] = "%s,%s" % (line, channel)
|
|
break
|
|
else:
|
|
perform.append('join %s' % channel)
|
|
|
|
def make_nick_menu(e, target):
|
|
def query():
|
|
core.events.run('query %s' % target, e.window, e.window.network)
|
|
|
|
def whois():
|
|
core.events.run('whois %s' % target, e.window, e.window.network)
|
|
|
|
e.menu += [
|
|
('Query', query),
|
|
('Whois', whois),
|
|
(),
|
|
]
|
|
|
|
def onHover(e):
|
|
set_target(e)
|
|
|
|
for is_check in (is_nick, is_url, is_chan):
|
|
if is_check(e):
|
|
e.tolink.add((e._target_fr, e._target_to))
|
|
break
|
|
|
|
def onClick(e):
|
|
set_target(e)
|
|
|
|
if is_nick(e):
|
|
core.events.run('query %s' % e._target, e.window, e.window.network)
|
|
|
|
# url of the form http://xxx.xxx or www.xxx.xxx
|
|
elif is_url(e):
|
|
if e._target.startswith('www'):
|
|
e._target = 'http://%s' % e._target
|
|
ui.open_file(e._target)
|
|
|
|
# click on a #channel
|
|
elif is_chan(e):
|
|
if not chaninfo.ischan(e.window.network, e._target):
|
|
e.window.network.join(e._target)
|
|
window = windows.get(windows.ChannelWindow, e.window.network, e._target)
|
|
if window:
|
|
window.activate()
|
|
|
|
def onRightClick(e):
|
|
set_target(e)
|
|
|
|
# nick on this channel
|
|
if is_nick(e):
|
|
make_nick_menu(e, e._target)
|
|
|
|
elif is_url(e):
|
|
if e._target.startswith('www'):
|
|
e._target = 'http://%s' % e._target
|
|
|
|
def copy_to():
|
|
# copy to clipboard
|
|
ui.set_clipboard(e._target)
|
|
|
|
e.menu += [('Copy', copy_to)]
|
|
|
|
elif is_chan(e):
|
|
e.channel = e._target
|
|
e.network = e.window.network
|
|
core.events.trigger('ChannelMenu', e)
|
|
|
|
def onListRightClick(e):
|
|
if isinstance(e.window, windows.ChannelWindow):
|
|
make_nick_menu(e, e.nick)
|
|
|
|
def onListDoubleClick(e):
|
|
if isinstance(e.window, windows.ChannelWindow):
|
|
core.events.run("query %s" % e.target, e.window, e.window.network)
|