Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services/console/lib/purk/scripts/clicks.py
blob: b2f3f8296bdae1524d0af4a9f12874a473c26030 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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)