summaryrefslogtreecommitdiff
path: root/pharo-mooc/tiny-chat/src/TinyChat-client/TinyChat.class.st
diff options
context:
space:
mode:
Diffstat (limited to 'pharo-mooc/tiny-chat/src/TinyChat-client/TinyChat.class.st')
-rw-r--r--pharo-mooc/tiny-chat/src/TinyChat-client/TinyChat.class.st130
1 files changed, 130 insertions, 0 deletions
diff --git a/pharo-mooc/tiny-chat/src/TinyChat-client/TinyChat.class.st b/pharo-mooc/tiny-chat/src/TinyChat-client/TinyChat.class.st
new file mode 100644
index 0000000..f19e3a4
--- /dev/null
+++ b/pharo-mooc/tiny-chat/src/TinyChat-client/TinyChat.class.st
@@ -0,0 +1,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
+]