h2g_ajaxchat 0.1.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/h2g_ajaxchat.rb +308 -154
- metadata +23 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7db5c15f7f4833080876a74afc5aa0a5076e8a08e5401c2d40a5a2b3c5082d89
|
4
|
+
data.tar.gz: 57f9b086460821188a16c3f028abc3528683afcb4efb23be2e460e1b7c84a442
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d8252c053581cc82b74299d5fb022ef064a08e1533824725b8af01fd44980bf487731b4653b30f0ed48b817a4ed4452601858af482784251f3115fc70307014
|
7
|
+
data.tar.gz: 340a2b64327b71919d839c9a860343ad55a93fa51f774090d991eec0ef4835c026beb8485f31e12cb6b00e4cf6cce58c3fdc50de0fbb8a2191aca196c8ce9d3d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/h2g_ajaxchat.rb
CHANGED
@@ -5,6 +5,47 @@
|
|
5
5
|
# description: This gem makes it easier to build an AJAX chat project.
|
6
6
|
# Designed for Rack-rscript.
|
7
7
|
|
8
|
+
require 'erb'
|
9
|
+
require 'simple-config'
|
10
|
+
|
11
|
+
# This file includes the following classes
|
12
|
+
#
|
13
|
+
# * AjaxChatPlugin Base class for plugins
|
14
|
+
# * DummyRequest (used for testing)
|
15
|
+
# * ChatCore (chat engine)
|
16
|
+
# * DummyRws (used for testing)
|
17
|
+
# * WebPage
|
18
|
+
# * Index < WebPage
|
19
|
+
# * Login < WebPage
|
20
|
+
# * Logout < WebPage
|
21
|
+
# * LogoutPost < WebPage
|
22
|
+
# * AjaxChat (the main class)
|
23
|
+
|
24
|
+
|
25
|
+
class AjaxChatPlugin
|
26
|
+
|
27
|
+
# ac = ajaxchat object
|
28
|
+
#
|
29
|
+
def initialize(ac, settings={}, debug: false)
|
30
|
+
@ac, @settings, @debug = ac, settings, debug
|
31
|
+
end
|
32
|
+
|
33
|
+
# Customises the ajax chat html etc;
|
34
|
+
#
|
35
|
+
def apply()
|
36
|
+
end
|
37
|
+
|
38
|
+
# messages from the plugin to be added to the chat timeline
|
39
|
+
#
|
40
|
+
def messages()
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
|
44
|
+
# messages from the chat timeline
|
45
|
+
#
|
46
|
+
def on_newmessage(time, userid, username, msg)
|
47
|
+
end
|
48
|
+
end
|
8
49
|
|
9
50
|
class DummyRequest
|
10
51
|
|
@@ -60,7 +101,6 @@ class ChatCore
|
|
60
101
|
else
|
61
102
|
|
62
103
|
return '' unless newmsg
|
63
|
-
puts '_messages: ' + @messages.inspect
|
64
104
|
@messages.length - 1
|
65
105
|
end
|
66
106
|
|
@@ -93,15 +133,12 @@ class ChatCore
|
|
93
133
|
|
94
134
|
end
|
95
135
|
|
96
|
-
protected
|
97
136
|
|
98
|
-
def append_message(
|
99
|
-
|
100
|
-
|
101
|
-
id =
|
102
|
-
@
|
103
|
-
|
104
|
-
@messages << [Time.now, id, u, msg]
|
137
|
+
def append_message(t=Time.now, id=@session[:session_id].to_s,
|
138
|
+
u=@session[:username], msg)
|
139
|
+
|
140
|
+
@users[id] = u.to_s
|
141
|
+
@messages << [t, id, u, msg]
|
105
142
|
|
106
143
|
end
|
107
144
|
|
@@ -109,22 +146,25 @@ end
|
|
109
146
|
|
110
147
|
class DummyRws
|
111
148
|
|
112
|
-
attr_accessor :req
|
149
|
+
attr_accessor :req, :ac
|
150
|
+
attr_reader :rsc
|
113
151
|
|
114
|
-
def initialize(
|
152
|
+
def initialize(ac=nil, rsc: nil)
|
115
153
|
|
116
|
-
@
|
154
|
+
@ac, @rsc = ac, rsc
|
117
155
|
|
118
156
|
end
|
119
157
|
|
120
158
|
def redirect(s)
|
121
|
-
@
|
159
|
+
@ac.method(s.to_sym).call
|
122
160
|
end
|
123
161
|
end
|
124
162
|
|
125
163
|
class WebPage
|
164
|
+
|
165
|
+
attr_accessor :css, :html, :js, :s
|
126
166
|
|
127
|
-
def initialize(h={})
|
167
|
+
def initialize( h={} )
|
128
168
|
@h = h
|
129
169
|
end
|
130
170
|
|
@@ -132,13 +172,21 @@ class WebPage
|
|
132
172
|
end
|
133
173
|
|
134
174
|
def to_html()
|
175
|
+
b = binding
|
176
|
+
|
177
|
+
ERB.new(html()).result(b)
|
135
178
|
end
|
136
179
|
|
137
180
|
def to_js()
|
181
|
+
js()
|
138
182
|
end
|
139
183
|
|
184
|
+
def s()
|
185
|
+
@s ||= html_template()
|
186
|
+
end
|
187
|
+
|
140
188
|
def to_s()
|
141
|
-
|
189
|
+
s()
|
142
190
|
end
|
143
191
|
|
144
192
|
protected
|
@@ -166,146 +214,20 @@ end
|
|
166
214
|
|
167
215
|
|
168
216
|
|
169
|
-
class AjaxChat
|
170
|
-
|
171
|
-
attr_reader :rws
|
172
|
-
|
173
|
-
def initialize(chatobj, rws=DummyRws.new(self), debug: false)
|
174
|
-
@chat, @rws, @debug = chatobj, rws, debug
|
175
|
-
end
|
176
|
-
|
177
|
-
def chatter(newmsg=nil)
|
178
|
-
|
179
|
-
id, users = @rws.req.session[:session_id].to_s, @chat.users
|
180
|
-
|
181
|
-
@chat.chatter(@rws.req, newmsg) do |t, uid, username, msg|
|
182
|
-
|
183
|
-
s2 = if id == uid then
|
184
|
-
"you: %s" % msg
|
185
|
-
else
|
186
|
-
"%s: %s" % [users[uid], msg]
|
187
|
-
end
|
188
|
-
|
189
|
-
"<p><span id='time'>%s</span> %s</p>" % [t.strftime("%H:%M:%S"), s2]
|
190
|
-
|
191
|
-
end
|
192
|
-
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
|
-
def login()
|
197
|
-
|
198
|
-
wp = WebPage.new
|
199
|
-
|
200
|
-
def wp.to_html()
|
201
|
-
'
|
202
|
-
<div id="loginform">
|
203
|
-
<form action="login" method="post">
|
204
|
-
<p>Please enter your name to continue:</p>
|
205
|
-
<label for="name">Name:</label>
|
206
|
-
<input type="text" name="name" id="name" autofocus="true"/>
|
207
|
-
<input type="submit" name="enter" id="enter" value="Enter" />
|
208
|
-
</form>
|
209
|
-
</div>
|
210
|
-
'
|
211
|
-
|
212
|
-
end
|
213
|
-
|
214
|
-
def wp.to_s()
|
215
|
-
to_html()
|
216
|
-
end
|
217
|
-
|
218
|
-
return wp
|
219
|
-
|
220
|
-
end
|
221
|
-
|
222
|
-
def login_post(username)
|
223
|
-
|
224
|
-
@chat.login @rws.req, username
|
225
|
-
@rws.redirect 'index'
|
226
|
-
|
227
|
-
end
|
228
|
-
|
229
|
-
def logout()
|
230
|
-
|
231
|
-
wp = WebPage.new
|
232
|
-
|
233
|
-
def wp.to_html()
|
234
|
-
'
|
235
|
-
<div id="logoutform">
|
236
|
-
<form action="logout" method="post">
|
237
|
-
<p>Are you sure you want to logout?</p>
|
238
|
-
<input type="submit" name="enter" id="enter" value="Yes" />
|
239
|
-
</form>
|
240
|
-
<a href="index">no, return to the chat page</a>
|
241
|
-
</div>
|
242
|
-
'
|
243
|
-
|
244
|
-
end
|
245
|
-
|
246
|
-
def wp.to_s()
|
247
|
-
to_html()
|
248
|
-
end
|
249
|
-
|
250
|
-
return wp
|
251
217
|
|
252
|
-
|
218
|
+
class Index < WebPage
|
253
219
|
|
254
|
-
def
|
255
|
-
|
256
|
-
@chat.logout @rws.req
|
257
|
-
|
258
|
-
wp = WebPage.new
|
259
|
-
|
260
|
-
def wp.to_s()
|
261
|
-
'You have successfully logged out'
|
262
|
-
end
|
263
|
-
|
264
|
-
return wp
|
265
|
-
|
266
|
-
end
|
267
|
-
|
268
|
-
def index()
|
269
|
-
|
270
|
-
@rws.req.session[:username] ? view_index() : login()
|
271
|
-
|
272
|
-
end
|
273
|
-
|
274
|
-
def messages()
|
275
|
-
@chat.messages
|
276
|
-
end
|
277
|
-
|
278
|
-
def req(obj)
|
279
|
-
@rws.req = obj
|
280
|
-
self
|
220
|
+
def initialize(h)
|
221
|
+
@h = h
|
281
222
|
end
|
282
223
|
|
283
|
-
def
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
private
|
288
|
-
|
289
|
-
def view_index()
|
290
|
-
|
291
|
-
h = {username: @rws.req.session[:username]}
|
292
|
-
|
293
|
-
wp = WebPage.new h
|
294
|
-
|
295
|
-
def wp.to_css()
|
296
|
-
'
|
297
|
-
body {font-family: Arial;}
|
298
|
-
#chatbox {overflow: scroll; height: 40%}
|
299
|
-
div p span {colour: #dde}
|
300
|
-
'
|
301
|
-
end
|
302
|
-
|
303
|
-
def wp.to_html()
|
304
|
-
<<EOF
|
224
|
+
def html()
|
225
|
+
|
226
|
+
@html ||= <<EOF
|
305
227
|
<body onload="refresh()">
|
306
228
|
<div id="wrapper">
|
307
229
|
<div id="menu">
|
308
|
-
<p class="welcome">Welcome, <b>
|
230
|
+
<p class="welcome">Welcome, <b> <%= @h[:username] %> </b></p>
|
309
231
|
<p class="logout"><a id="exit" href="logout">Exit Chat</a></p>
|
310
232
|
<div style="clear:both"></div>
|
311
233
|
</div>
|
@@ -313,12 +235,26 @@ div p span {colour: #dde}
|
|
313
235
|
<input name="usermsg" type="text" id="usermsg" size="33" onkeyup='ajaxCall1(event.keyCode, this)' autofocus='true'/>
|
314
236
|
|
315
237
|
</div>
|
316
|
-
|
317
238
|
EOF
|
318
|
-
end
|
319
239
|
|
320
|
-
|
321
|
-
|
240
|
+
end
|
241
|
+
|
242
|
+
def to_css()
|
243
|
+
@css ||= '
|
244
|
+
body {font-family: Arial;}
|
245
|
+
#chatbox {overflow: scroll; height: 40%}
|
246
|
+
div p span {colour: #dde}
|
247
|
+
'
|
248
|
+
end
|
249
|
+
|
250
|
+
def to_html()
|
251
|
+
|
252
|
+
super()
|
253
|
+
end
|
254
|
+
|
255
|
+
def js()
|
256
|
+
|
257
|
+
@js ||= <<EOF
|
322
258
|
|
323
259
|
function updateScroll(){
|
324
260
|
var element = document.getElementById("chatbox");
|
@@ -365,12 +301,230 @@ function ajaxCall2() {
|
|
365
301
|
|
366
302
|
EOF
|
367
303
|
|
304
|
+
end
|
368
305
|
|
369
|
-
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
class Login < WebPage
|
310
|
+
|
311
|
+
def initialize(h={})
|
370
312
|
|
371
|
-
|
313
|
+
end
|
314
|
+
|
315
|
+
def html()
|
316
|
+
|
317
|
+
@html ||= '
|
318
|
+
<div id="loginform">
|
319
|
+
<form action="login" method="post">
|
320
|
+
<p>Please enter your name to continue:</p>
|
321
|
+
<label for="name">Name:</label>
|
322
|
+
<input type="text" name="name" id="name" autofocus="true"/>
|
323
|
+
<input type="submit" name="enter" id="enter" value="Enter" />
|
324
|
+
</form>
|
325
|
+
</div>
|
326
|
+
'
|
372
327
|
|
373
328
|
end
|
329
|
+
|
330
|
+
|
331
|
+
end
|
374
332
|
|
333
|
+
class Logout < WebPage
|
334
|
+
|
335
|
+
def initialize(h={})
|
336
|
+
|
337
|
+
end
|
338
|
+
|
339
|
+
def html()
|
340
|
+
|
341
|
+
@html ||= '
|
342
|
+
<div id="logoutform">
|
343
|
+
<form action="logout" method="post">
|
344
|
+
<p>Are you sure you want to logout?</p>
|
345
|
+
<input type="submit" name="enter" id="enter" value="Yes" />
|
346
|
+
</form>
|
347
|
+
<a href="index">no, return to the chat page</a>
|
348
|
+
</div>
|
349
|
+
'
|
350
|
+
|
351
|
+
end
|
352
|
+
|
353
|
+
|
354
|
+
end
|
355
|
+
|
356
|
+
class LogoutPost < WebPage
|
357
|
+
|
358
|
+
def initialize(h={})
|
359
|
+
|
360
|
+
end
|
361
|
+
|
362
|
+
def s()
|
363
|
+
|
364
|
+
@s ||= 'You have successfully logged out'
|
365
|
+
|
366
|
+
end
|
367
|
+
|
368
|
+
|
375
369
|
end
|
376
370
|
|
371
|
+
|
372
|
+
class AjaxChat
|
373
|
+
|
374
|
+
attr_reader :rws, :views
|
375
|
+
|
376
|
+
def initialize(chatobj=ChatCore.new, rws: DummyRws.new(self), config: nil,
|
377
|
+
debug: false)
|
378
|
+
|
379
|
+
@chat, @rws, @debug = chatobj, rws, debug
|
380
|
+
|
381
|
+
@plugins = if config then
|
382
|
+
|
383
|
+
SimpleConfig.new(config).to_h.map do |name, settings|
|
384
|
+
|
385
|
+
puts 'name: ' + name.inspect if @debug
|
386
|
+
settings = {} if settings.is_a? String
|
387
|
+
|
388
|
+
next if settings[:disabled]
|
389
|
+
pluginklass_name = 'AjaxChatPlugin' + name.to_s
|
390
|
+
|
391
|
+
#Kernel.const_get(pluginklass_name).new(self, settings, debug: false)
|
392
|
+
eval("#{pluginklass_name}.new(self, #{settings}, debug: false)")
|
393
|
+
|
394
|
+
end.compact
|
395
|
+
|
396
|
+
else
|
397
|
+
|
398
|
+
[]
|
399
|
+
|
400
|
+
end
|
401
|
+
|
402
|
+
@h = {}
|
403
|
+
|
404
|
+
@index, @login, @logout, @logout_post = \
|
405
|
+
[Index, Login, Logout, LogoutPost].map do |klass|
|
406
|
+
|
407
|
+
klass.new @h
|
408
|
+
|
409
|
+
end
|
410
|
+
|
411
|
+
@views = {
|
412
|
+
index: @index,
|
413
|
+
login: @login,
|
414
|
+
logout: @logout,
|
415
|
+
logout_post: @logout_post
|
416
|
+
}
|
417
|
+
|
418
|
+
@plugins.each {|plugin| plugin.apply if plugin.respond_to? :apply }
|
419
|
+
|
420
|
+
end
|
421
|
+
|
422
|
+
def chatter(newmsg=nil)
|
423
|
+
|
424
|
+
id, users = @rws.req.session[:session_id].to_s, @chat.users
|
425
|
+
|
426
|
+
chat = @chat
|
427
|
+
|
428
|
+
# check for new messages to be added via the plugins
|
429
|
+
@plugins.each do |plugin|
|
430
|
+
|
431
|
+
next unless plugin.respond_to? :messages
|
432
|
+
plugin.messages.each {|x| chat.append_message *x }
|
433
|
+
|
434
|
+
end
|
435
|
+
|
436
|
+
plugins = @plugins
|
437
|
+
|
438
|
+
@chat.chatter(@rws.req, newmsg) do |t, uid, username, msg|
|
439
|
+
|
440
|
+
plugins.each do |x|
|
441
|
+
|
442
|
+
x.on_newmessage(t, uid, username, msg) if x.respond_to? :on_newmessage
|
443
|
+
|
444
|
+
end
|
445
|
+
|
446
|
+
s2 = if id == uid then
|
447
|
+
"you: %s" % msg
|
448
|
+
else
|
449
|
+
"%s: %s" % [users[uid], msg]
|
450
|
+
end
|
451
|
+
|
452
|
+
"<p><span id='time'>%s</span> %s</p>" % [t.strftime("%H:%M:%S"), s2]
|
453
|
+
|
454
|
+
end
|
455
|
+
|
456
|
+
end
|
457
|
+
|
458
|
+
def login()
|
459
|
+
|
460
|
+
view @login
|
461
|
+
|
462
|
+
end
|
463
|
+
|
464
|
+
def login_post(username)
|
465
|
+
|
466
|
+
@chat.login @rws.req, username
|
467
|
+
@h[:username] = username
|
468
|
+
@rws.redirect 'index'
|
469
|
+
|
470
|
+
end
|
471
|
+
|
472
|
+
def logout()
|
473
|
+
|
474
|
+
view @logout
|
475
|
+
|
476
|
+
end
|
477
|
+
|
478
|
+
def logout_post()
|
479
|
+
|
480
|
+
@chat.logout @rws.req
|
481
|
+
view @logout_post
|
482
|
+
|
483
|
+
end
|
484
|
+
|
485
|
+
def index()
|
486
|
+
|
487
|
+
if @rws.req.session[:username] then
|
488
|
+
|
489
|
+
@h[:username] = @rws.req.session[:username]
|
490
|
+
view @index
|
491
|
+
|
492
|
+
else
|
493
|
+
|
494
|
+
@rws.redirect 'login'
|
495
|
+
|
496
|
+
end
|
497
|
+
|
498
|
+
end
|
499
|
+
|
500
|
+
# used for debugging
|
501
|
+
def messages()
|
502
|
+
@chat.messages
|
503
|
+
end
|
504
|
+
|
505
|
+
def req(obj)
|
506
|
+
|
507
|
+
@rws.req = obj
|
508
|
+
self
|
509
|
+
|
510
|
+
end
|
511
|
+
|
512
|
+
# used for debugging
|
513
|
+
def users()
|
514
|
+
@chat.users
|
515
|
+
end
|
516
|
+
|
517
|
+
private
|
518
|
+
|
519
|
+
def view(obj)
|
520
|
+
|
521
|
+
puts 'inside view obj: ' + obj.inspect if @debug
|
522
|
+
|
523
|
+
if obj.to_s.length > 0 then
|
524
|
+
obj.to_s
|
525
|
+
else
|
526
|
+
obj
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: h2g_ajaxchat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,8 +35,28 @@ cert_chain:
|
|
35
35
|
PrknRa5wCOkWn6MNeaZ10MuRCv0E4IRGb8q/2WczGDXI3lmwDWOzPzia3/A32vdt
|
36
36
|
hlwWFeE0gWND9J9tivS5qxBI
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2020-07-
|
39
|
-
dependencies:
|
38
|
+
date: 2020-07-06 00:00:00.000000000 Z
|
39
|
+
dependencies:
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: simple-config
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.7.0
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.7'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 0.7.0
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0.7'
|
40
60
|
description:
|
41
61
|
email: james@jamesrobertson.eu
|
42
62
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|