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
147
148
149
150
151
|
#
# tkextlib/tcllib/chatwidget.rb
# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#
# * Part of tcllib extension
# * chatwidget - Provides a multi-paned view suitable for display of
# chat room or irc channel information
#
require 'tk'
require 'tkextlib/tcllib.rb'
# TkPackage.require('chatwidget', '1.1.0')
TkPackage.require('chatwidget')
module Tk::Tcllib
class ChatWidget < TkText
PACKAGE_NAME = 'chatwidget'.freeze
def self.package_name
PACKAGE_NAME
end
def self.package_version
begin
TkPackage.require('chatwidget')
rescue
''
end
end
end
end
class Tk::Tcllib::ChatWidget
TkCommandNames = ['::chatwidget::chatwidget'.freeze].freeze
def show_topic
tk_send_without_enc('topic', 'show')
self
end
def hide_topic
tk_send_without_enc('topic', 'hide')
self
end
def set_topic(topic)
tk_send('topic', 'set', topic)
end
def list_name
tk_split_simplelist(tk_send('name', 'list'))
end
def list_name_full
tk_split_simplelist(tk_send('name', 'list')).map{|lst|
nick, *opts = tk_split_simplelist(lst)
h_opt = {}
opts.slice(2){|k, v| h_opt[k[1..-1]] = tk_tcl2ruby(v)}
[nick, h_opt]
}
end
def add_name(nick, opts={})
tk_send('name', 'add', nick, *(hash_kv(opts)))
end
def delete_name(nick)
tk_send('name', 'delete', nick)
end
def get_name(nick)
lst = tk_send('name', 'get', nick)
return nil if lst.empty?
nick, *opts = tk_split_simplelist(lst)
h_opt = {}
opts.slice(2){|k, v| h_opt[k[1..-1]] = tk_tcl2ruby(v)}
[nick, h_opt]
end
def message(msg, opts={})
tk_send('message', msg, *(hash_kv(opts)))
self
end
def _parse_hook_list(lst)
tk_split_simplelist(lst).map{|hook|
cmd, prior = tk_split_simplelist(hook)
[procedure(cmd), number(prior)]
}
end
private :_parse_hook_list
def hook_add(type, *args, &blk) # args -> [prior, cmd], [prior], [cmd]
#type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
if prior = args.shift
if !prior.kind_of?(Numeric)
cmd = prior
if (prior = args.shift) && !prior.kind_of?(Numeric) # error
args.unshift(prior)
end
args.unshift(cmd)
end
prior ||= 50 # default priority
end
cmd = args.shift || blk
fail ArgumentError, "invalid arguments" unless args.empty?
fail ArgumentError, "no callback is given" unless cmd
_parse_hook_list(tk_send('hook', 'add', type, cmd, prior))
end
def hook_remove(type, cmd)
#type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
_parse_hook_list(tk_send('hook', 'remove', type, cmd))
end
def hook_run(type, *cmd_args)
#type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
tk_send('hook', 'run', type, *cmd_args)
end
def hook_list(type)
#type -> 'message', 'post', 'names_group', 'names_nick', 'chatstate', 'url'
_parse_hook_list(tk_send('hook', 'list', type))
end
def show_names
tk_send('names', 'show')
self
end
def hide_names
tk_send('names', 'hide')
self
end
def names_widget
window(tk_send('names'))
end
def entry_widget
window(tk_send('entry'))
end
def chat_widget
window(tk_send('chat'))
end
end
|