Skip to content

Commit 8a98b07

Browse files
committed
Improve nickname functionality
1 parent 194354a commit 8a98b07

File tree

11 files changed

+63
-95
lines changed

11 files changed

+63
-95
lines changed

PlaneTalk.xcodeproj/project.pbxproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
EF8CBE64241AC1E3009AB2D0 /* MessageFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF8CBE63241AC1E3009AB2D0 /* MessageFactory.swift */; };
3434
EF95F80A2402CDF30002C047 /* Connector.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF95F8092402CDF30002C047 /* Connector.swift */; };
3535
EF95F80C2402D5D20002C047 /* Notification+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF95F80B2402D5D20002C047 /* Notification+Ext.swift */; };
36-
EF95F8102402E35C0002C047 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF95F80F2402E35C0002C047 /* User.swift */; };
3736
EF95F830240309370002C047 /* MessageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF95F82E240309370002C047 /* MessageTableViewCell.swift */; };
3837
EF95F831240309370002C047 /* MessageTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EF95F82F240309370002C047 /* MessageTableViewCell.xib */; };
3938
EF9C42DB241A564F00564AC2 /* ViewDataConfigurable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF9C42DA241A564F00564AC2 /* ViewDataConfigurable.swift */; };
@@ -73,7 +72,6 @@
7372
EF8CBE63241AC1E3009AB2D0 /* MessageFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageFactory.swift; sourceTree = "<group>"; };
7473
EF95F8092402CDF30002C047 /* Connector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connector.swift; sourceTree = "<group>"; };
7574
EF95F80B2402D5D20002C047 /* Notification+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Ext.swift"; sourceTree = "<group>"; };
76-
EF95F80F2402E35C0002C047 /* User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
7775
EF95F82E240309370002C047 /* MessageTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageTableViewCell.swift; sourceTree = "<group>"; };
7876
EF95F82F240309370002C047 /* MessageTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MessageTableViewCell.xib; sourceTree = "<group>"; };
7977
EF9C42DA241A564F00564AC2 /* ViewDataConfigurable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewDataConfigurable.swift; sourceTree = "<group>"; };
@@ -223,7 +221,6 @@
223221
children = (
224222
EF3D9D9B241D1603009079FC /* Transmission */,
225223
EF50585F23FF0BEB001020FD /* Devices */,
226-
EF95F80F2402E35C0002C047 /* User.swift */,
227224
EF50585523FEDC84001020FD /* Interface.swift */,
228225
EF8CBE61241ABDCD009AB2D0 /* ChatMessage.swift */,
229226
EF8CBE5B241AB343009AB2D0 /* PlatformUtils.swift */,
@@ -315,7 +312,6 @@
315312
isa = PBXSourcesBuildPhase;
316313
buildActionMask = 2147483647;
317314
files = (
318-
EF95F8102402E35C0002C047 /* User.swift in Sources */,
319315
EF9C42E5241A889000564AC2 /* NibLoadable.swift in Sources */,
320316
EF884EC523F76403002CB0EE /* ChatViewController.swift in Sources */,
321317
EF95F80A2402CDF30002C047 /* Connector.swift in Sources */,

PlaneTalk/ChatViewController.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ extension ChatViewController: TextBoardViewDelegate {
157157

158158
extension MessageTableViewCell.ViewData {
159159
static func from(_ chatMessage: ChatMessage) -> MessageTableViewCell.ViewData {
160-
let textColor = chatMessage.isMe ? MessageTableViewCell.Constant.outgoingMessageTextColor : MessageTableViewCell.Constant.incomingMessageTextColor
161-
let backgroundColor = chatMessage.isMe ? MessageTableViewCell.Constant.outgoingMessageBubbleColor : MessageTableViewCell.Constant.incomingMessageBubbleColor
160+
let textColor = chatMessage.isMyMessage ? MessageTableViewCell.Constant.outgoingMessageTextColor : MessageTableViewCell.Constant.incomingMessageTextColor
161+
let backgroundColor = chatMessage.isMyMessage ? MessageTableViewCell.Constant.outgoingMessageBubbleColor : MessageTableViewCell.Constant.incomingMessageBubbleColor
162162

163163
return MessageTableViewCell.ViewData(
164-
sender: chatMessage.sender,
164+
sender: chatMessage.senderAlias,
165165
text: chatMessage.text,
166166
textColor: textColor,
167167
backgroundColor: backgroundColor,
168-
alignment: chatMessage.isMe ? .right : .left
168+
alignment: chatMessage.isMyMessage ? .right : .left
169169
)
170170
}
171171
}

PlaneTalk/Controllers/Manager.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -170,45 +170,45 @@ extension Manager: UDPCommunicationDelegate {
170170

171171
// MARK: - ServerTCPCommunicationDelegate
172172
extension Manager: ServerTCPCommunicationDelegate {
173-
// Server wants to send his message
173+
// Generate a MessageType using the protocol syntax
174174
func serverWantsToSendTCPText(_ text: String) -> MessageType {
175175
return messageFactory.generateServerMessage(from: text)
176176
}
177177

178-
// Server wants to send a client message
178+
// Generate a MessageType using the protocol syntax
179179
func serverDidReceiveClientTCPText(_ text: String, senderIP: String) -> MessageType {
180180
return messageFactory.generateClientMessage(from: text, senderIP: senderIP)
181181
}
182182

183183
// Server did send his text
184184
func serverDidSendText(_ text: String) {
185-
let chatMessage = ChatMessage(text: text, sender: "Me", isMe: true)
185+
let chatMessage = ChatMessage(text: text, senderAlias: "Me", isMyMessage: true)
186186
presentMessage(chatMessage: chatMessage)
187187
}
188188

189189
// Server did a client text
190-
func serverDidSendClientText(_ text: String, clientIP: String) {
191-
let chatMessage = ChatMessage(text: text, sender: clientIP, isMe: false)
190+
func serverDidSendClientText(_ text: String, senderAlias: String) {
191+
let chatMessage = ChatMessage(text: text, senderAlias: senderAlias, isMyMessage: false)
192192
presentMessage(chatMessage: chatMessage)
193193
}
194194

195195
// Server did send an information text
196196
func serverDidSendInformationText(_ text: String) {
197-
let chatMessage = ChatMessage(text: text, sender: "Information", isMe: false)
197+
let chatMessage = ChatMessage(text: text, senderAlias: "Information", isMyMessage: false)
198198
presentMessage(chatMessage: chatMessage)
199199
}
200200
}
201201

202202
// MARK: - ClientTCPCommunicationDelegate
203203
extension Manager: ClientTCPCommunicationDelegate {
204204
func clientDidReceiveTCPText(_ text: String) {
205-
let message = messageFactory.getTextAndServer(from: text)
206-
let chatMessage = ChatMessage(text: message.text, sender: message.senderIP, isMe: false)
205+
let message = messageFactory.receivedUDPText(text)
206+
let chatMessage = ChatMessage(text: message.text, senderAlias: message.senderIP, isMyMessage: false)
207207
presentMessage(chatMessage: chatMessage)
208208
}
209209

210210
func clientDidSendText(_ text: String) {
211-
let chatMessage = ChatMessage(text: text, sender: "Me", isMe: true)
211+
let chatMessage = ChatMessage(text: text, senderAlias: "Me", isMyMessage: true)
212212
presentMessage(chatMessage: chatMessage)
213213
}
214214
}

PlaneTalk/Controllers/MessageFactory.swift

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ class MessageFactory {
1818
static let serverDiscovery = "CHAT-SERVER-DISCOVERY"
1919
static let serverResponse = "CHAT-SERVER-RESPONSE-"
2020
static let separator = "-/-"
21+
static let newNicknameString = "%@ is %@"
2122
static let nicknameRegex = "^/name: ([0-z]{4,})$"
2223
}
2324

25+
private var nicknames: [IP: String] = [:]
2426
private let device: NetworkDevice
2527

2628
init(device: NetworkDevice) {
@@ -30,17 +32,23 @@ class MessageFactory {
3032
// MARK: - TCP
3133
func generateServerMessage(from text: String) -> MessageType {
3234
if let newNickname = checkPossibleChangeNicknameRegex(in: text) {
33-
return .nicknameChangeRequest(nickname: newNickname)
35+
nicknames[device.ip] = newNickname
36+
let content = String(format: Constant.newNicknameString, device.ip, newNickname)
37+
return .nicknameChangeRequest(fullText: [newNickname, content].joined(separator: Constant.separator) , content: content)
3438
} else {
35-
return .text(fullText: [text, device.ip].joined(separator: Constant.separator), content: text, senderAlias: device.ip)
39+
let senderAlias = nicknames[device.ip] ?? device.ip
40+
return .text(fullText: [senderAlias,text].joined(separator: Constant.separator), content: text, senderAlias: senderAlias)
3641
}
3742
}
3843

39-
func generateClientMessage(from text: String, senderIP: String) -> MessageType {
44+
func generateClientMessage(from text: String, senderIP: IP) -> MessageType {
4045
if let newNickname = checkPossibleChangeNicknameRegex(in: text) {
41-
return .nicknameChangeRequest(nickname: newNickname)
46+
nicknames[senderIP] = newNickname
47+
let content = String(format: Constant.newNicknameString, senderIP, newNickname)
48+
return .nicknameChangeRequest(fullText: [newNickname, content].joined(separator: Constant.separator) , content: content)
4249
} else {
43-
return .text(fullText: [text, senderIP].joined(separator: Constant.separator), content: text, senderAlias: senderIP)
50+
let senderAlias = nicknames[senderIP] ?? senderIP
51+
return .text(fullText: [senderAlias, text].joined(separator: Constant.separator), content: text, senderAlias: senderAlias)
4452
}
4553
}
4654

@@ -49,13 +57,14 @@ class MessageFactory {
4957
return Message(text: text, senderIP: senderIP)
5058
}
5159

52-
func getTextAndServer(from text: String) -> Message {
60+
func receivedUDPText(_ text: String) -> Message {
5361
let splitted = text.components(separatedBy: Constant.separator)
5462
guard splitted.count > 1 else {
63+
assertionFailure("Missing field")
5564
return Message(text: text, senderIP: "!!")
5665
}
5766

58-
return Message(text: splitted[0], senderIP: splitted[1])
67+
return Message(text: splitted[1], senderIP: splitted[0])
5968
}
6069

6170
var serverBroadcastAuthenticationResponse: String {

PlaneTalk/Model/ChatMessage.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ import Foundation
1010

1111
struct ChatMessage {
1212
let text: String
13-
let sender: String
14-
let isMe: Bool
13+
let senderAlias: String
14+
let isMyMessage: Bool
1515
}
1616

1717
enum MessageType {
1818
// Full text refers to the all protocol string sent whereas the content is the actualy typed text
1919
case text(fullText: String, content: String, senderAlias: String)
20-
case nicknameChangeRequest(nickname: String)
20+
case nicknameChangeRequest(fullText: String, content: String)
2121
}

PlaneTalk/Model/Devices/Client.swift

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,6 @@
99
import Foundation
1010

1111
protocol ClientInterface {
12-
var serverIP: String { get }
13-
14-
// The kqueue for all the tcp events
15-
var tcpEventQueue: Int32 { get }
16-
// The socket where the client receives the messages
17-
var client_tcp_socket_fd: Int32 { get }
18-
var clientTCPCommunicationDelegate: ClientTCPCommunicationDelegate? { get }
19-
2012
func startTCPconnectionToServer()
2113
}
2214

PlaneTalk/Model/Devices/NetworkDevice.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
import Foundation
1010

1111
protocol NetworkDevice: AnyObject {
12-
var ip: String { get }
12+
var ip: IP { get }
1313
}

PlaneTalk/Model/Devices/Server.swift

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,12 @@
99
import Foundation
1010

1111
protocol ServerInterface: BroadcastDevice {
12-
// Incoming TCP connections socket
13-
var incoming_tcp_connections_socket: Int32 { get }
14-
var tcpKQueue: Int32 { get }
15-
var connectionSockets: [Int32: User] { get }
16-
var maxListeningConnections: Int32 { get }
17-
var serverTCPCommunicationDelegate: ServerTCPCommunicationDelegate? { get }
18-
1912
func enableTCPCommunication()
2013
func handleNewConnection()
21-
func receivedClientTCPText(_ text: String, socket: Int32, user: User)
22-
func sendClientText(fullText: String, content: String, user: User, socket: Int32)
14+
func receivedClientTCPText(_ text: String, socket: Int32, senderIP: String)
15+
func sendClientText(fullText: String, content: String, senderAlias: String, socket: Int32)
2316
func sendServerText(_ text: String)
24-
func sendInformationText(_ text: String)
17+
func sendInformationText(fullText: String, content: String)
2518
}
2619

2720
final class Server: ServerInterface {
@@ -38,22 +31,19 @@ final class Server: ServerInterface {
3831
weak var udpCommunicationDelegate: UDPCommunicationDelegate?
3932
weak var roleGrantDelegate: GrantRoleDelegate? // to be removed
4033

41-
4234
// Incoming TCP connections socket
43-
var incoming_tcp_connections_socket: Int32 = -1
35+
private var incoming_tcp_connections_socket: Int32 = -1
4436
// Kqueue to organise tcp events
45-
let tcpKQueue: Int32 = kqueue()
37+
private let tcpKQueue: Int32 = kqueue()
4638

4739
// Map of the fd and their IPs
48-
var connectionSockets: [Int32: User] = [:]
40+
var connectionSockets: [Int32: String] = [:]
4941
// Array of all the kevents
5042
private var kEvents: [kevent] = []
5143

52-
let maxListeningConnections: Int32 = 5
53-
5444
weak var serverTCPCommunicationDelegate: ServerTCPCommunicationDelegate?
5545

56-
private var nickname: String?
46+
let maxListeningConnections: Int32 = 5
5747
var ip: String
5848

5949
init(
@@ -177,8 +167,8 @@ final class Server: ServerInterface {
177167
close(Int32(fd))
178168
} else if incoming_tcp_connections_socket == fd {
179169
handleNewConnection()
180-
} else if let fd_and_user = connectionSockets.first(where: ({ $0.key == fd })) {
181-
incomingClientTCPText(socket: fd_and_user.key, user: fd_and_user.value)
170+
} else if let ip = connectionSockets[Int32(fd)] {
171+
incomingClientTCPText(socket: Int32(fd), senderIP: ip)
182172
}
183173
}
184174
default:
@@ -205,7 +195,7 @@ final class Server: ServerInterface {
205195
}
206196

207197
// Save client ip with associated fd
208-
connectionSockets[connection_socket_and_client_ip.fd] = User(IP: connection_socket_and_client_ip.IP)
198+
connectionSockets[connection_socket_and_client_ip.fd] = connection_socket_and_client_ip.IP
209199

210200
// Create the kevent structure that sets up our kqueue to listen
211201
// for notifications
@@ -225,7 +215,7 @@ final class Server: ServerInterface {
225215
}
226216

227217
// A message from a client is about to come
228-
private func incomingClientTCPText(socket: Int32, user: User) {
218+
private func incomingClientTCPText(socket: Int32, senderIP: String) {
229219
let receivedStringBuffer = UnsafeMutableBufferPointer<CChar>.allocate(capacity: 65536)
230220
let rawPointer = UnsafeMutableRawPointer(receivedStringBuffer.baseAddress)
231221

@@ -239,27 +229,26 @@ final class Server: ServerInterface {
239229
}
240230
let string = String(cString: UnsafePointer(baseAddress))
241231
// Handle the message in order to understand whether is a standard message or a nick change request
242-
receivedClientTCPText(string, socket: socket, user: user)
232+
receivedClientTCPText(string, socket: socket, senderIP: senderIP)
243233
}
244234

245235
// MARK: - Send message
246236
// Send the message of the client whose socket is clientSocket to all of the other clients
247-
func receivedClientTCPText(_ text: String, socket: Int32, user: User) {
248-
guard let messageType = serverTCPCommunicationDelegate?.serverDidReceiveClientTCPText(text, senderIP: user.IP) else {
237+
func receivedClientTCPText(_ text: String, socket: Int32, senderIP: String) {
238+
guard let messageType = serverTCPCommunicationDelegate?.serverDidReceiveClientTCPText(text, senderIP: senderIP) else {
249239
print("Nil communicationDelegate")
250240
return
251241
}
252242

253243
switch messageType {
254-
case .nicknameChangeRequest(let nickname):
255-
connectionSockets[socket]?.changeNickname(nickname)
256-
sendInformationText("\(user.IP) is now \(nickname)")
244+
case .nicknameChangeRequest(let fullText, let content):
245+
sendInformationText(fullText: fullText, content: content)
257246
case .text(let fullText, let content, let senderAlias):
258-
sendClientText(fullText: fullText, content: content, user: user, socket: socket)
247+
sendClientText(fullText: fullText, content: content, senderAlias: senderAlias, socket: socket)
259248
}
260249
}
261250

262-
func sendClientText(fullText: String, content: String, user: User, socket: Int32) {
251+
func sendClientText(fullText: String, content: String, senderAlias: String, socket: Int32) {
263252
for event in kEvents where event.ident != UInt(socket) {
264253
let fd = event.ident
265254
fullText.withCString { cString in
@@ -272,7 +261,7 @@ final class Server: ServerInterface {
272261
}
273262
}
274263
}
275-
serverTCPCommunicationDelegate?.serverDidSendClientText(content, clientIP: user.IP)
264+
serverTCPCommunicationDelegate?.serverDidSendClientText(content, senderAlias: senderAlias)
276265
}
277266

278267
// Send server own text
@@ -284,7 +273,7 @@ final class Server: ServerInterface {
284273
}
285274

286275
switch messageType {
287-
case .text(let fullText, let content, let senderAlias):
276+
case .text(let fullText, let content, _):
288277
for event in kEvents {
289278
let fd = event.ident
290279

@@ -299,25 +288,24 @@ final class Server: ServerInterface {
299288
}
300289
}
301290
}
302-
case .nicknameChangeRequest(nickname: let nickname):
303-
self.nickname = nickname
304-
sendInformationText("\(ip) is now \(nickname)")
291+
case .nicknameChangeRequest(let fullText, let content):
292+
sendInformationText(fullText: fullText, content: content)
305293
}
306294
}
307295

308296
// Send information text such as nickname change
309-
func sendInformationText(_ text: String) {
297+
func sendInformationText(fullText: String, content: String) {
310298
for event in kEvents {
311299
let fd = event.ident
312300

313-
text.withCString { cString in
301+
fullText.withCString { cString in
314302
let messageLength = Int(strlen(cString))
315303
let bytes = send(Int32(fd), cString, messageLength, 0)
316304
if bytes < 0 {
317305
print("Error sending TCP Message")
318306
} else {
319-
print("Sent by server: \(text)")
320-
serverTCPCommunicationDelegate?.serverDidSendInformationText(text)
307+
print("Sent by server: \(content)")
308+
serverTCPCommunicationDelegate?.serverDidSendInformationText(content)
321309
}
322310
}
323311
}

PlaneTalk/Model/Transmission/TCP/ServerTransmission.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ protocol ServerTCPCommunicationDelegate: UDPCommunicationDelegate {
1313
func serverDidReceiveClientTCPText(_ text: String, senderIP: String) -> MessageType
1414

1515
func serverDidSendText(_ text: String)
16-
func serverDidSendClientText(_ text: String, clientIP: String)
16+
func serverDidSendClientText(_ text: String, senderAlias: String)
1717
func serverDidSendInformationText(_ text: String)
1818
}

PlaneTalk/Model/User.swift

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)