Skip to content

Commit 143e98a

Browse files
authored
Merge pull request #7 from IanKeen/bot-cleanup
Bot Beautification!
2 parents bb1fc07 + 1d21c7a commit 143e98a

File tree

10 files changed

+392
-117
lines changed

10 files changed

+392
-117
lines changed

Sources/App/Services/HelloBot.swift

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,15 @@ import RTMAPI
1111
import WebAPI
1212
import Models
1313

14-
final class HelloBot: SlackBotAPI {
15-
func connected(slackBot: SlackBot, botUser: BotUser, team: Team, users: [User], channels: [Channel], groups: [Group], ims: [IM]) { }
16-
func disconnected(slackBot: SlackBot, error: ErrorProtocol?) { }
17-
func error(slackBot: SlackBot, error: ErrorProtocol) { }
18-
func event(slackBot: SlackBot, event: RTMAPIEvent, webApi: WebAPI) { }
19-
14+
final class HelloBot: SlackMessageService {
2015
func message(slackBot: SlackBot, message: MessageAdaptor, previous: MessageAdaptor?) {
2116
let greetings = ["hello", "hi", "hey"]
2217
guard
2318
let target = message.target, sender = message.sender
2419
else { return }
2520

2621
if (message.text.hasPrefix(options: greetings) && message.mentioned_users.contains(slackBot.me)) {
27-
slackBot.chat(target: target, text: "hey, <@\(sender.id)>")
22+
slackBot.chat(with: target, text: "hey, <@\(sender.id)>")
2823
}
2924
}
3025
}

Sources/App/Services/KarmaBot.swift

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,13 @@ extension KarmaBot {
4747
}
4848
}
4949

50-
final class KarmaBot: SlackBotAPI {
50+
final class KarmaBot: SlackRTMEventService, SlackMessageService {
5151
private let options: Options
5252

5353
init(options: Options) {
5454
self.options = options
5555
}
5656

57-
func connected(slackBot: SlackBot, botUser: BotUser, team: Team, users: [User], channels: [Channel], groups: [Group], ims: [IM]) { }
58-
func disconnected(slackBot: SlackBot, error: ErrorProtocol?) { }
59-
func error(slackBot: SlackBot, error: ErrorProtocol) { }
6057
func event(slackBot: SlackBot, event: RTMAPIEvent, webApi: WebAPI) {
6158
switch event {
6259
case .reaction_added(let reaction, let user, let itemCreator, let target):
@@ -70,7 +67,7 @@ final class KarmaBot: SlackBotAPI {
7067
self.adjustKarma(of: itemCreator, action: karma, storage: slackBot.storage)
7168

7269
slackBot.chat(
73-
target: target,
70+
with: target,
7471
text: karma.randomMessage(user: itemCreator, storage: slackBot.storage)
7572
)
7673

@@ -97,10 +94,7 @@ final class KarmaBot: SlackBotAPI {
9794

9895
guard !response.isEmpty else { return }
9996

100-
slackBot.chat(
101-
target: target,
102-
text: response
103-
)
97+
slackBot.chat(with: target, text: response)
10498
}
10599

106100
private func karma(for user: User, from message: MessageAdaptor) -> KarmaAction? {

Sources/App/main.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ let config = try SlackBotConfig.makeConfig(from: Environment())
1818
let bot = SlackBot(
1919
config: config,
2020
storage: try RedisStorage(url: config.storageUrl!),
21-
apis: [
22-
HelloBot(),
23-
KarmaBot(options: KarmaBot.Options(
21+
services: [
22+
HelloBot(),
23+
KarmaBot(options: KarmaBot.Options(
2424
targets: ["*"],
2525
addText: "++",
2626
addReaction: "+1",

Sources/Bot/Adaptors/MessageAdaptor.swift

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,34 @@
88

99
import Models
1010

11+
/// A wrapper around a `Message` model to provide additional functionality
1112
public 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
82103
extension 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
100123
extension Message {
101124
func toAdaptor(slackModels: SlackBot.SlackModelClosure) -> MessageAdaptor {
102125
return MessageAdaptor(message: self, slackModels: slackModels)

Sources/Bot/Builders/SlackMessageBuilder+Operators.swift

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

12+
/**
13+
These are a set of optional operators to make constructing a `SlackMessage` made of lots of components a little more fluent
14+
Everything these operators do can be done with the `SlackMessage` object directly
15+
*/
16+
17+
18+
//MARK: - SlackMessage Operators
19+
1220
func +(builder: SlackMessage, value: String) -> SlackMessage {
1321
return builder.text(value)
1422
}

0 commit comments

Comments
 (0)