88
99import Models
1010
11+ /// A wrapper around a `Message` model to provide additional functionality
1112public struct MessageAdaptor {
1213 //MARK: - Private
1314 private let slackModels : SlackBot . SlackModelClosure
1415
1516 //MARK: - Public Raw Properties
17+ /// The underlying `Message` this `MessageAdaptor` uses
1618 public let message : Message
1719
1820 //MARK: - Public Derived Properties
21+ /// `String` representing the text of the `Message`
1922 public var text : String { return self . message. text ?? " " }
23+
24+ /// The `User` representing the sender of this `Message`
2025 public var sender : User ? {
2126 return
2227 self . message. user ??
2328 self . message. edited? . user ??
2429 self . message. inviter ??
2530 self . message. bot
2631 }
32+
33+ /// The `Target` for this `Message`
2734 public var target : Target ? {
2835 return self . message. channel? . value
2936 }
37+
38+ /// A sequence of mentioned `User`s in the `Message`
3039 public var mentioned_users : [ User ] {
3140 let users = slackModels ( ) . users + slackModels( ) . users. botUsers ( )
3241
@@ -35,6 +44,8 @@ public struct MessageAdaptor {
3544 users. filter { $0. id == link. link }
3645 }
3746 }
47+
48+ /// A sequence of mentioned `Channel`s in the `Message`
3849 public var mentioned_channels : [ Channel ] {
3950 let channels = slackModels ( ) . channels
4051
@@ -43,17 +54,32 @@ public struct MessageAdaptor {
4354 channels. filter { $0. id == link. link }
4455 }
4556 }
57+
58+ /// A sequence of mentioned `Link`s in the `Message` that are not `Channel`s or `User`s
4659 public var mentioned_links : [ Link ] {
4760 return self . mentionedLinks ( ) {
4861 !$0. link. hasPrefix ( " @ " ) && !$0. link. hasPrefix ( " # " )
4962 }
5063 }
64+
65+ //MARK: - Lifecycle
66+ init ( message: Message , slackModels: SlackBot . SlackModelClosure ) {
67+ self . message = message
68+ self . slackModels = slackModels
69+ }
70+ }
71+
72+ //MARK: - Link Extraction
73+ extension MessageAdaptor {
5174 private func mentionedLinks( prefix: String = " " , filter: ( ( Link ) -> Bool ) = { _ in true } ) -> [ Link ] {
5275 guard self . text. characters. contains ( " < " ) && self . text. characters. contains ( " > " ) else { return [ ] }
5376
5477 //NOTE: so far I've just been avoid RegEx for the sake of it...
5578 // however if I turn to the dark side the expression used should be <(.*?)>
5679 //
80+ //TODO
81+ //UPDATE: The more I look at the code below the more I dislike it :P - pony up and change to regex...
82+ //
5783 //From Slack: https://api.slack.com/docs/formatting
5884 //1. Detect all sequences matching <(.*?)>
5985 //2. Within those sequences, format content starting with #C as a channel link
@@ -71,15 +97,11 @@ public struct MessageAdaptor {
7197 . flatMap { Link ( link: $0) }
7298 . filter { filter ( $0) }
7399 }
74-
75- //MARK: - Lifecycle
76- init ( message: Message , slackModels: SlackBot . SlackModelClosure ) {
77- self . message = message
78- self . slackModels = slackModels
79- }
80100}
81101
102+ //MARK: - Message.Link
82103extension MessageAdaptor {
104+ /// Represents a link extracted from a `Message`
83105 public struct Link {
84106 public let link : String
85107 public let displayText : String
@@ -97,6 +119,7 @@ extension MessageAdaptor {
97119 }
98120}
99121
122+ //MARK: - Convenience: Message to MessageAdaptor
100123extension Message {
101124 func toAdaptor( slackModels: SlackBot . SlackModelClosure ) -> MessageAdaptor {
102125 return MessageAdaptor ( message: self , slackModels: slackModels)
0 commit comments