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
|
Class {
#name : 'TinyChat',
#superclass : 'Object',
#instVars : [
'url',
'login',
'exit',
'messages',
'console',
'lastMessageIndex'
],
#category : 'TinyChat-client',
#package : 'TinyChat-client'
}
{ #category : 'as yet unclassified' }
TinyChat class >> connect: aHost port: aPort login: aLogin [
^ self new
host: aHost port: aPort login: aLogin;
start
]
{ #category : 'initialization' }
TinyChat >> cmdLastMessageID [
^ self command: '/messages/count'
]
{ #category : 'initialization' }
TinyChat >> cmdMessagesFromLastIndexToEnd [
"Returns the server messages from my current last index to the last on the server."
^ self command: '/messages' argument: lastMessageIndex
]
{ #category : 'initialization' }
TinyChat >> cmdNewMessage [
^self command: '/messages/add'
]
{ #category : 'initialization' }
TinyChat >> command: aPath [
^'{1}{2}' format: { url . aPath }
]
{ #category : 'initialization' }
TinyChat >> command: aPath argument: anArgument [
^'{1}{2}/{3}' format: { url . aPath . anArgument asString }
]
{ #category : 'initialization' }
TinyChat >> disconnect [
self sendNewMessage: (TCMessage from: login text: 'I exited from the chat room.').
exit := true
]
{ #category : 'as yet unclassified' }
TinyChat >> host: aHost port: aPort login: aLogin [
url := 'http://' , aHost , ':' , aPort asString.
login := aLogin
]
{ #category : 'initialization' }
TinyChat >> initialize [
super initialize.
exit := false.
lastMessageIndex := 0.
messages := OrderedCollection new
]
{ #category : 'initialization' }
TinyChat >> readLastMessageID [
| id |
id := (ZnClient new url: self cmdLastMessageID; get) asInteger.
id = 0 ifTrue: [ id := 1 ].
^ id
]
{ #category : 'initialization' }
TinyChat >> readMissingMessages [
"Gets the new messages that have been posted since the last request."
| response receivedMessages |
response := (ZnClient new url: self cmdMessagesFromLastIndexToEnd; get).
^ response
ifNil: [ 0 ]
ifNotNil: [
receivedMessages := response substrings: (String crlf).
receivedMessages do: [ :msg | messages add: (TCMessage fromString: msg) ].
receivedMessages size
]
]
{ #category : 'initialization' }
TinyChat >> refreshMessages [
[
[ exit ] whileFalse: [
(Delay forSeconds: 2) wait.
lastMessageIndex := lastMessageIndex + (self readMissingMessages).
console print: messages
]
] fork
]
{ #category : 'initialization' }
TinyChat >> send: aString [
"When we send a message, we push it to the server and in addition
we update the local list of posted messages"
| msg |
msg := TCMessage from: login text: aString.
self sendNewMessage: msg.
lastMessageIndex := lastMessageIndex + (self readMissingMessages).
console print: messages
]
{ #category : 'initialization' }
TinyChat >> sendNewMessage: aMessage [
^ ZnClient new
url: self cmdNewMessage;
formAt: 'sender' put: (aMessage sender);
formAt: 'text' put: (aMessage text);
post
]
{ #category : 'initialization' }
TinyChat >> start [
console := TCConsole attach: self.
self sendNewMessage: (TCMessage from: login text: 'I joined the chat room').
lastMessageIndex := self readLastMessageID.
self refreshMessages
]
|