blob: 365f91fb2aa3c8f7adfc62b57506d02d3910b43e (
plain)
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
|
import SwiftUI
enum ChatMessageType {
case agreement
case status
case joined
case left
case message
case server
case signOut
}
extension ChatMessageType {
var storageKey: String {
switch self {
case .agreement:
return "agreement"
case .status:
return "status"
case .joined:
return "joined"
case .left:
return "left"
case .message:
return "message"
case .server:
return "server"
case .signOut:
return "signOut"
}
}
init?(storageKey: String) {
switch storageKey {
case "agreement":
self = .agreement
case "status":
self = .status
case "joined":
self = .joined
case "left":
self = .left
case "message":
self = .message
case "server":
self = .server
case "signOut":
self = .signOut
default:
return nil
}
}
}
struct ChatMessage: Identifiable {
let id = UUID()
let text: String
let type: ChatMessageType
let date: Date
let username: String?
static let parser = /^\s*([^\:]+):\s*([\s\S]+)$/
init(text: String, type: ChatMessageType, date: Date) {
self.type = type
self.date = date
if
type == .message,
let match = text.firstMatch(of: ChatMessage.parser) {
self.username = String(match.1)
self.text = String(match.2)
}
else {
self.username = nil
self.text = text
}
}
}
|