aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Models/ChatMessage.swift
blob: f7383ba54b7b84b9356d48e64ceb5bf66fe5b377 (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
import SwiftUI

enum ChatMessageType {
  case agreement
  case joined
  case left
  case message
  case server
  case signOut
}

extension ChatMessageType {
  var storageKey: String {
    switch self {
    case .agreement:
      return "agreement"
    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 "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?
  var metadata: ChatStore.EntryMetadata?
  
  static let parser = /^\s*([^\:]+):\s*([\s\S]+)$/

  init(text: String, type: ChatMessageType, date: Date) {
    self.id = UUID()
    self.type = type
    self.date = date
    self.metadata = nil

    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
    }
  }
}