6
6
-- Date: 31.10.2010
7
7
---- -----------------------------------------------------------------
8
8
9
- local tabs = {}
10
- local edits = {}
11
- local memos = {}
12
- local messages = {}
13
- local gridlists = {}
14
- local memolines = {}
15
9
local x ,y = guiGetScreenSize ()
10
+ local g_channels = {}
11
+ local window
16
12
17
13
---- --------------------------------
18
14
-- Irc client
19
15
---- --------------------------------
20
- addCommandHandler (" irc" ,
21
- function ()
22
- if window then
23
- guiGridListSetSortingEnabled (gridlist ,true )
24
- guiSetInputEnabled (true )
25
- guiSetVisible (window ,true )
26
- guiSetVisible (exitbutton ,true )
27
- showCursor (true )
28
- else
29
- triggerServerEvent (" startIRCClient" ,getLocalPlayer ())
30
- end
31
- end ,false ,false
32
- )
33
-
34
- addEvent (" showIrcClient" ,true )
35
- addEventHandler (" showIrcClient" ,root ,
36
- function (info )
37
- window = guiCreateWindow (0.25 ,0.3 ,0.5 ,0.6 ," Internet Relay Chat" ,true )
38
- exitbutton = guiCreateButton (0.95 ,0.03 ,0.2 ,0.03 ," Close" ,true ,window )
39
- tabpanel = guiCreateTabPanel (0 ,0.08 ,1 ,0.9 ,true ,window )
40
- guiSetProperty (exitbutton ," AlwaysOnTop" ," True" )
41
- -- guiWindowSetMovable(window,false)
42
- -- guiWindowSetSizable(window,false)
43
- for i ,inf in ipairs (info ) do
44
- local chantitle = inf [1 ]
45
- local tab = guiCreateTab (chantitle ,tabpanel )
46
- local edit = guiCreateEdit (0.005 ,0.915 ,0.74 ,0.07 ," " ,true ,tab )
47
- local memo = guiCreateMemo (0.005 ,0.01 ,0.74 ,0.9 ," " ,true ,tab )
48
- local gridlist = guiCreateGridList (0.75 ,0.01 ,0.245 ,0.99 ,true ,tab )
49
- local column = guiGridListAddColumn (gridlist ," Users" ,0.8 )
50
- guiGridListSetSortingEnabled (gridlist ,true )
51
- for i ,user in ipairs (inf [2 ]) do
16
+ addEvent (" ircStartClient" ,true )
17
+ addEventHandler (" ircStartClient" ,root ,
18
+ function (channels )
19
+ window = guiCreateWindow ((x / 2 )- 320 ,(y / 2 )- 240 ,640 ,480 ," Internet Relay Chat" ,false )
20
+ local tabpanel = guiCreateTabPanel (0.01 ,0.05 ,0.98 ,0.95 ,true ,window )
21
+ for i ,channel in ipairs (channels ) do
22
+ local tab = guiCreateTab (channel .name ,tabpanel )
23
+ local memo = guiCreateMemo (0.01 ,0.01 ,0.75 ,0.90 ," * Topic is: " .. channel .topic .. " \n " ,true ,tab )
24
+ local edit = guiCreateEdit (0.01 ,0.92 ,0.75 ,0.07 ," " ,true ,tab )
25
+ local gridlist = guiCreateGridList (0.76 ,0.01 ,0.23 ,0.90 ,true ,tab )
26
+ local hidebtn = guiCreateButton (0.76 ,0.92 ,0.11 ,0.07 ," Hide" ,true ,tab )
27
+ local closebtn = guiCreateButton (0.88 ,0.92 ,0.11 ,0.07 ," Close" ,true ,tab )
28
+ guiGridListAddColumn (gridlist ," users" ,0.88 )
29
+ guiMemoSetReadOnly (memo ,true )
30
+ for i ,user in ipairs (channel .users ) do
52
31
local row = guiGridListAddRow (gridlist )
53
- guiGridListSetItemText (gridlist ,row ,column ,getIconFromLevel (user [2 ]).. user [1 ],false ,false )
32
+ guiGridListSetItemText (gridlist ,row ,1 ,getIconFromLevel (user .level ).. user .name ,false ,false )
33
+ guiGridListSetItemData (gridlist ,row ,1 ,user .name )
54
34
end
55
- tabs [chantitle ] = tab
56
- edits [chantitle ] = edit
57
- memos [chantitle ] = memo
58
- gridlists [chantitle ] = gridlist
59
- memolines [memo ] = {}
35
+ guiGridListSetSortingEnabled (gridlist ,true )
36
+ addEventHandler (" onClientGUIClick" ,closebtn ,ircStopClient ,false )
37
+ addEventHandler (" onClientGUIClick" ,hidebtn ,ircHideClient ,false )
38
+ addEventHandler (" onClientGUIAccepted" ,edit ,
39
+ function (edit )
40
+ local text = guiGetText (edit )
41
+ if text and text ~= " " then
42
+ triggerServerEvent (" ircSendMessage" ,resourceRoot ,localPlayer ,channel .name ,text )
43
+ guiSetText (edit ," " )
44
+ end
45
+ end
46
+ )
47
+ g_channels [channel .name ] = {memo = memo ,edit = edit ,gridlist = gridlist }
60
48
end
61
- guiBringToFront (exitbutton )
62
49
guiSetInputEnabled (true )
63
- showCursor (true )
64
50
end
65
51
)
66
52
67
- addEventHandler (" onClientGUIAccepted" ,root ,
68
- function (editbox )
69
- for chantitle ,edit in pairs (edits ) do
70
- if edit == editbox then
71
- triggerServerEvent (" ircSay" ,getLocalPlayer (),chantitle ,guiGetText (editbox ))
72
- guiSetText (editbox ," " )
73
- return
74
- end
75
- end
76
- end
77
- )
78
-
79
- addEventHandler (" onClientGUIClick" ,root ,
80
- function (btn )
81
- if btn ~= " left" then return end
82
- if source == exitbutton then
83
- guiSetInputEnabled (false )
84
- guiSetVisible (window ,false )
85
- guiSetVisible (exitbutton ,false )
53
+ addEventHandler (" onClientResourceStop" ,resourceRoot ,
54
+ function ()
55
+ if window then
86
56
showCursor (false )
57
+ guiSetInputEnabled (false )
87
58
end
88
59
end
89
60
)
90
61
91
- addEvent (" onClientIRCMessage" ,true )
92
- addEventHandler (" onClientIRCMessage" ,root ,
93
- function (user ,chantitle ,message )
94
- memoAddLine (memos [chantitle ],user .. " : " .. message )
95
- end
96
- )
62
+ function ircStopClient ()
63
+ destroyElement (window )
64
+ window = nil
65
+ channels = {}
66
+ showCursor (false )
67
+ guiSetInputEnabled (false )
68
+ triggerServerEvent (" ircStopClient" ,resourceRoot ,localPlayer )
69
+ end
97
70
98
- addEvent (" onClientIRCUserJoin" ,true )
99
- addEventHandler (" onClientIRCUserJoin" ,root ,
100
- function (user ,chantitle ,vhost )
101
- local row = guiGridListAddRow (gridlists [chantitle ])
102
- guiGridListSetItemText (gridlists [chantitle ],row ,1 ,user ,false ,false )
103
- memoAddLine (memos [chantitle ]," * " .. user .. " (" .. vhost .. " ) joined" )
104
- end
105
- )
71
+ function ircHideClient ()
72
+ guiSetVisible (window ,false )
73
+ showCursor (false )
74
+ guiSetInputEnabled (false )
75
+ end
106
76
107
- addEvent (" onClientIRCUserPart" ,true )
108
- addEventHandler (" onClientIRCUserPart" ,root ,
109
- function (user ,chantitle ,reason )
110
- for i = 1 ,guiGridListGetRowCount (gridlists [chantitle ]) do
111
- if guiGridListGetItemText (gridlists [chantitle ],i ,1 ) == user then
112
- guiGridListRemoveRow (gridlists [chantitle ],i )
113
- break
114
- end
115
- if string.sub (guiGridListGetItemText (gridlists [chantitle ],i ,1 ),2 ) == user then
116
- guiGridListRemoveRow (gridlists [chantitle ],i )
117
- break
118
- end
77
+ addCommandHandler (" irc" ,
78
+ function ()
79
+ if window then
80
+ guiSetVisible (window ,true )
81
+ showCursor (true )
82
+ guiSetInputEnabled (true )
119
83
end
120
- memoAddLine (memos [chantitle ]," * " .. user .. " parted (" .. (reason or " " ).. " )" )
121
- end
84
+ end ,false
122
85
)
123
86
124
- addEvent (" onClientIRCUserQuit" ,true )
125
- addEventHandler (" onClientIRCUserQuit" ,root ,
126
- function (user ,reason )
127
- for i ,gridlist in pairs (gridlists ) do
128
- for i = 1 ,guiGridListGetRowCount (gridlist ) do
129
- if guiGridListGetItemText (gridlist ,i ,1 ) == user then
130
- guiGridListRemoveRow (gridlist ,i )
131
- break
132
- end
133
- end
134
- end
135
- for i ,memo in pairs (memos ) do
136
- memoAddLine (memo ," * " .. user .. " (" .. vhost .. " ) quit (" .. reason .. " )" )
87
+ local icons = {" +" ," %" ," @" ," &" ," ~" }
88
+ function getIconFromLevel (level )
89
+ return icons [level ] or " "
90
+ end
91
+
92
+ function getLevelFromIcon (ico )
93
+ for i ,icon in ipairs (icons ) do
94
+ if icon == ico then
95
+ return i
137
96
end
138
97
end
139
- )
98
+ return false
99
+ end
100
+
101
+ function addMessage (channel ,message )
102
+ guiSetText (g_channels [channel ].memo ,guiGetText (g_channels [channel ].memo ).. " " .. message )
103
+ end
140
104
141
- addEvent (" onClientIRCNotice" ,true )
142
- addEventHandler (" onClientIRCNotice" ,root ,
143
- function (user ,chantitle ,message )
144
- memoAddLine (memos [chantitle ]," <notice> " .. user .. " : " .. message )
105
+ addEvent (" onIRCMessage" ,true )
106
+ addEventHandler (" onIRCMessage" ,root ,
107
+ function (user ,channel ,message )
108
+ if g_channels [channel ] then
109
+ addMessage (channel ," <" .. user .. " > " .. message )
110
+ end
145
111
end
146
112
)
147
113
148
- addEvent (" onClientIRCUserMode" ,true )
149
- addEventHandler (" onClientIRCUserMode" ,root ,
150
- function (user ,chantitle ,positive ,mode ,setter ,newlevel )
151
- if positive then
152
- memoAddLine (memos [chantitle ]," * " .. (setter or " Server" ).. " sets mode: +" .. mode .. " " .. user )
153
- else
154
- memoAddLine (memos [chantitle ]," * " .. (setter or " Server" ).. " sets mode: -" .. mode .. " " .. user )
114
+ addEvent (" onIRCUserJoin" ,true )
115
+ addEventHandler (" onIRCUserJoin" ,root ,
116
+ function (user ,channel ,vhost )
117
+ if g_channels [channel ] then
118
+ addMessage (channel ," * " .. user .. " joined (" .. vhost .. " )" )
119
+ local row = guiGridListAddRow (g_channels [channel ].gridlist )
120
+ guiGridListSetItemText (g_channels [channel ].gridlist ,row ,1 ,user ,false ,false )
121
+ guiGridListSetItemData (g_channels [channel ].gridlist ,row ,1 ,user )
155
122
end
156
123
end
157
124
)
158
125
159
- addEvent (" onClientIRCChannelMode" ,true )
160
- addEventHandler (" onClientIRCChannelMode" ,root ,
161
- function (chantitle ,positive ,mode ,setter )
162
- if positive then
163
- memoAddLine (memos [chantitle ]," * " .. (setter or " Server" ).. " sets mode: +" .. mode )
164
- else
165
- memoAddLine (memos [chantitle ]," * " .. (setter or " Server" ).. " sets mode: -" .. mode )
126
+ addEvent (" onIRCUserPart" ,true )
127
+ addEventHandler (" onIRCUserPart" ,root ,
128
+ function (user ,channel ,reason )
129
+ if g_channels [channel ] then
130
+ addMessage (channel ," * " .. user .. " parted (" .. reason .. " )" )
131
+ for i = 0 ,guiGridListGetRowCount (g_channels [channel ].gridlist )- 1 do
132
+ if guiGridListGetItemData (g_channels [channel ].gridlist ,i ,1 ) == user then
133
+ guiGridListRemoveRow (g_channels [channel ].gridlist ,i )
134
+ end
135
+ end
166
136
end
167
137
end
168
138
)
169
139
170
- addEvent (" onClientIRCLevelChange" ,true )
171
- addEventHandler (" onClientIRCLevelChange" ,root ,
172
- function (user ,chantitle ,oldlevel ,newlevel )
173
- for i = 1 ,guiGridListGetRowCount (gridlists [chantitle ]) do
174
- if guiGridListGetItemText (gridlists [chantitle ],i ,1 ) == user then
175
- guiGridListSetItemText (gridlists [chantitle ],i ,1 ,getIconFromLevel (newlevel ).. user ,false ,false )
176
- break
177
- end
178
- if string.sub (guiGridListGetItemText (gridlists [chantitle ],i ,1 ),2 ) == user then
179
- guiGridListSetItemText (gridlists [chantitle ],i ,1 ,getIconFromLevel (newlevel ).. user ,false ,false )
180
- break
140
+ addEvent (" onIRCUserQuit" ,true )
141
+ addEventHandler (" onIRCUserQuit" ,root ,
142
+ function (user ,reason )
143
+ for channel ,info in pairs (g_channels ) do
144
+ for i = 0 ,guiGridListGetRowCount (info .gridlist )- 1 do
145
+ if guiGridListGetItemData (info .gridlist ,i ,1 ) == user then
146
+ guiGridListRemoveRow (info .gridlist ,i )
147
+ addMessage (channel ," * " .. user .. " quit (" .. reason .. " )" )
148
+ end
181
149
end
182
150
end
183
151
end
184
152
)
185
153
186
- addEvent (" onClientIRCUserChangeNick" ,true )
187
- addEventHandler (" onClientIRCUserChangeNick" ,root ,
188
- function (oldnick ,newnick )
189
- for i ,gridlist in pairs (gridlists ) do
190
- for i = 1 ,guiGridListGetRowCount (gridlist ) do
191
- if guiGridListGetItemText (gridlist ,i ,1 ) == oldnick then
192
- guiGridListSetItemText (gridlist ,i ,1 ,newnick ,false ,false )
193
- break
194
- end
195
- if string.sub (guiGridListGetItemText (gridlist ,i ,1 ),2 ) == oldnick then
196
- guiGridListSetItemText (gridlist ,i ,1 ,string.sub (guiGridListGetItemText (gridlist ,i ,1 ),1 ,1 ).. newnick ,false ,false )
197
- break
154
+ addEvent (" onIRCLevelChange" ,true )
155
+ addEventHandler (" onIRCLevelChange" ,root ,
156
+ function (user ,channel ,oldlevel ,newlevel )
157
+ if g_channels [channel ] then
158
+ addMessage (channel ," * " .. user .. " changed level from " .. tostring (oldlevel ).. " to " .. tostring (newlevel ))
159
+ for i = 0 ,guiGridListGetRowCount (g_channels [channel ].gridlist )- 1 do
160
+ if guiGridListGetItemData (g_channels [channel ].gridlist ,i ,1 ) == user then
161
+ guiGridListSetItemText (g_channels [channel ].gridlist ,i ,1 ,getIconFromLevel (newlevel ).. user ,false ,false )
198
162
end
199
163
end
200
164
end
201
165
end
202
166
)
203
167
204
- function memoAddLine (memo ,line )
205
- if # memolines [memo ] > 16 then
206
- table.remove (memolines [memo ],1 )
168
+ addEvent (" onIRCUserChangeNick" ,true )
169
+ addEventHandler (" onIRCUserChangeNick" ,root ,
170
+ function (user ,oldnick ,newnick )
171
+ for channel ,info in pairs (g_channels ) do
172
+ for i = 0 ,guiGridListGetRowCount (info .gridlist )- 1 do
173
+ if guiGridListGetItemData (info .gridlist ,i ,1 ) == oldnick then
174
+ addMessage (channel ," * " .. oldnick .. " is now know as " .. newnick )
175
+ local oldIcon = string.sub (guiGridListGetItemText (info .gridlist ,i ,1 ),1 ,1 )
176
+ if not getLevelFromIcon (oldIcon ) then oldIcon = " " end
177
+ guiGridListSetItemText (info .gridlist ,i ,1 ,oldIcon .. newnick ,false ,false )
178
+ guiGridListSetItemData (info .gridlist ,i ,1 ,newnick )
179
+ end
180
+ end
181
+ end
207
182
end
208
- table.insert (memolines [memo ],line )
209
- return guiSetText (memo ,table.concat (memolines [memo ]," \n " ))
210
- end
211
-
212
- local icons = {" +" ," %" ," @" ," &" ," ~" }
213
- function getIconFromLevel (level )
214
- return icons [level ] or " "
215
- end
183
+ )
0 commit comments