diff --git a/SlackKit/Sources/Client.swift b/SlackKit/Sources/Client.swift index 4070300..fed3313 100644 --- a/SlackKit/Sources/Client.swift +++ b/SlackKit/Sources/Client.swift @@ -57,15 +57,16 @@ public class Client: WebSocketDelegate { } private var webSocket: WebSocket? - + private var dispatcher: EventDispatcher? + required public init() { - } public static let sharedInstance = Client() //MARK: - Connection public func connect() { + dispatcher = EventDispatcher(client: self) let request = NSURLRequest(URL: NSURL(string:"https://slack.com/api/rtm.start?token="+token)!) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.currentQueue()!) { (response, data, error) -> Void in @@ -233,7 +234,7 @@ public class Client: WebSocketDelegate { return } do { - try EventDispatcher.eventDispatcher(NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! [String: AnyObject]) + try dispatcher?.dispatch(NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) as! [String: AnyObject]) } catch _ { diff --git a/SlackKit/Sources/EventDispatcher.swift b/SlackKit/Sources/EventDispatcher.swift index d0a3acb..cb2e2b0 100644 --- a/SlackKit/Sources/EventDispatcher.swift +++ b/SlackKit/Sources/EventDispatcher.swift @@ -21,122 +21,129 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -internal struct EventDispatcher { +internal class EventDispatcher { + let client: Client + let handler: EventHandler - static func eventDispatcher(event: [String: AnyObject]) { + required init(client: Client) { + self.client = client + handler = EventHandler(client: client) + } + + func dispatch(event: [String: AnyObject]) { let event = Event(event: event) if let type = event.type { switch type { case .Hello: - EventHandler.connected() + handler.connected() case .Ok: - EventHandler.messageSent(event) + handler.messageSent(event) case .Message: if (event.subtype != nil) { messageDispatcher(event) } else { - EventHandler.messageReceived(event) + handler.messageReceived(event) } case .UserTyping: - EventHandler.userTyping(event) + handler.userTyping(event) case .ChannelMarked, .IMMarked, .GroupMarked: - EventHandler.channelMarked(event) + handler.channelMarked(event) case .ChannelCreated, .IMCreated: - EventHandler.channelCreated(event) + handler.channelCreated(event) case .ChannelJoined, .GroupJoined: - EventHandler.channelJoined(event) + handler.channelJoined(event) case .ChannelLeft, .GroupLeft: - EventHandler.channelLeft(event) + handler.channelLeft(event) case .ChannelDeleted: - EventHandler.channelDeleted(event) + handler.channelDeleted(event) case .ChannelRenamed, .GroupRename: - EventHandler.channelRenamed(event) + handler.channelRenamed(event) case .ChannelArchive, .GroupArchive: - EventHandler.channelArchived(event, archived: true) + handler.channelArchived(event, archived: true) case .ChannelUnarchive, .GroupUnarchive: - EventHandler.channelArchived(event, archived: false) + handler.channelArchived(event, archived: false) case .ChannelHistoryChanged, .IMHistoryChanged, .GroupHistoryChanged: - EventHandler.channelHistoryChanged(event) + handler.channelHistoryChanged(event) case .DNDUpdated: - EventHandler.doNotDisturbUpdated(event) + handler.doNotDisturbUpdated(event) case .DNDUpatedUser: - EventHandler.doNotDisturbUserUpdated(event) + handler.doNotDisturbUserUpdated(event) case .IMOpen, .GroupOpen: - EventHandler.open(event, open: true) + handler.open(event, open: true) case .IMClose, .GroupClose: - EventHandler.open(event, open: false) + handler.open(event, open: false) case .FileCreated: - EventHandler.processFile(event) + handler.processFile(event) case .FileShared: - EventHandler.processFile(event) + handler.processFile(event) case .FileUnshared: - EventHandler.processFile(event) + handler.processFile(event) case .FilePublic: - EventHandler.processFile(event) + handler.processFile(event) case .FilePrivate: - EventHandler.filePrivate(event) + handler.filePrivate(event) case .FileChanged: - EventHandler.processFile(event) + handler.processFile(event) case .FileDeleted: - EventHandler.deleteFile(event) + handler.deleteFile(event) case .FileCommentAdded: - EventHandler.fileCommentAdded(event) + handler.fileCommentAdded(event) case .FileCommentEdited: - EventHandler.fileCommentEdited(event) + handler.fileCommentEdited(event) case .FileCommentDeleted: - EventHandler.fileCommentDeleted(event) + handler.fileCommentDeleted(event) case .PinAdded: - EventHandler.pinAdded(event) + handler.pinAdded(event) case .PinRemoved: - EventHandler.pinRemoved(event) + handler.pinRemoved(event) case .PresenceChange: - EventHandler.presenceChange(event) + handler.presenceChange(event) case .ManualPresenceChange: - EventHandler.manualPresenceChange(event) + handler.manualPresenceChange(event) case .PrefChange: - EventHandler.changePreference(event) + handler.changePreference(event) case .UserChange: - EventHandler.userChange(event) + handler.userChange(event) case .TeamJoin: - EventHandler.teamJoin(event) + handler.teamJoin(event) case .StarAdded: - EventHandler.itemStarred(event, star: true) + handler.itemStarred(event, star: true) case .StarRemoved: - EventHandler.itemStarred(event, star: false) + handler.itemStarred(event, star: false) case .ReactionAdded: - EventHandler.addedReaction(event) + handler.addedReaction(event) case .ReactionRemoved: - EventHandler.removedReaction(event) + handler.removedReaction(event) case .EmojiChanged: - EventHandler.emojiChanged(event) + handler.emojiChanged(event) case .CommandsChanged: // Not implemented per Slack documentation. break case .TeamPlanChange: - EventHandler.teamPlanChange(event) + handler.teamPlanChange(event) case .TeamPrefChange: - EventHandler.teamPreferenceChange(event) + handler.teamPreferenceChange(event) case .TeamRename: - EventHandler.teamNameChange(event) + handler.teamNameChange(event) case .TeamDomainChange: - EventHandler.teamDomainChange(event) + handler.teamDomainChange(event) case .EmailDomainChange: - EventHandler.emailDomainChange(event) + handler.emailDomainChange(event) case .BotAdded: - EventHandler.bot(event) + handler.bot(event) case .BotChanged: - EventHandler.bot(event) + handler.bot(event) case .AccountsChanged: // Not implemented per Slack documentation. break case .TeamMigrationStarted: Client.sharedInstance.connect() case .SubteamCreated, .SubteamUpdated: - EventHandler.subteam(event) + handler.subteam(event) case .SubteamSelfAdded: - EventHandler.subteamAddedSelf(event) + handler.subteamAddedSelf(event) case.SubteamSelfRemoved: - EventHandler.subteamRemovedSelf(event) + handler.subteamRemovedSelf(event) case .Error: print("Error: \(event)") break @@ -144,15 +151,15 @@ internal struct EventDispatcher { } } - static func messageDispatcher(event:Event) { + func messageDispatcher(event:Event) { let subtype = MessageSubtype(rawValue: event.subtype!)! switch subtype { case .MessageChanged: - EventHandler.messageChanged(event) + handler.messageChanged(event) case .MessageDeleted: - EventHandler.messageDeleted(event) + handler.messageDeleted(event) default: - EventHandler.messageReceived(event) + handler.messageReceived(event) } } diff --git a/SlackKit/Sources/EventHandler.swift b/SlackKit/Sources/EventHandler.swift index e81a3dc..09c85ca 100644 --- a/SlackKit/Sources/EventHandler.swift +++ b/SlackKit/Sources/EventHandler.swift @@ -23,70 +23,74 @@ import Foundation -internal struct EventHandler { +internal class EventHandler { + let client: Client + required init(client: Client) { + self.client = client + } //MARK: - Initial connection - static func connected() { - Client.sharedInstance.connected = true + func connected() { + client.connected = true - if let delegate = Client.sharedInstance.slackEventsDelegate { + if let delegate = client.slackEventsDelegate { delegate.clientConnected() } } //MARK: - Messages - static func messageSent(event: Event) { - if let reply = event.replyTo, message = Client.sharedInstance.sentMessages[NSNumber(double: reply).stringValue], channel = message.channel, ts = message.ts { + func messageSent(event: Event) { + if let reply = event.replyTo, message = client.sentMessages[NSNumber(double: reply).stringValue], channel = message.channel, ts = message.ts { message.ts = event.ts message.text = event.text - Client.sharedInstance.channels[channel]?.messages[ts] = message + client.channels[channel]?.messages[ts] = message - if let delegate = Client.sharedInstance.messageEventsDelegate { + if let delegate = client.messageEventsDelegate { delegate.messageSent(message) } } } - static func messageReceived(event: Event) { + func messageReceived(event: Event) { if let channel = event.channel, message = event.message, id = channel.id, ts = message.ts { - Client.sharedInstance.channels[id]?.messages[ts] = message + client.channels[id]?.messages[ts] = message - if let delegate = Client.sharedInstance.messageEventsDelegate { + if let delegate = client.messageEventsDelegate { delegate.messageReceived(message) } } } - static func messageChanged(event: Event) { + func messageChanged(event: Event) { if let id = event.channel?.id, nested = event.nestedMessage, ts = nested.ts { - Client.sharedInstance.channels[id]?.messages[ts] = nested + client.channels[id]?.messages[ts] = nested - if let delegate = Client.sharedInstance.messageEventsDelegate { + if let delegate = client.messageEventsDelegate { delegate.messageChanged(nested) } } } - static func messageDeleted(event: Event) { + func messageDeleted(event: Event) { if let id = event.channel?.id, key = event.message?.deletedTs { - let message = Client.sharedInstance.channels[id]?.messages[key] - Client.sharedInstance.channels[id]?.messages.removeValueForKey(key) + let message = client.channels[id]?.messages[key] + client.channels[id]?.messages.removeValueForKey(key) - if let delegate = Client.sharedInstance.messageEventsDelegate { + if let delegate = client.messageEventsDelegate { delegate.messageDeleted(message) } } } //MARK: - Channels - static func userTyping(event: Event) { + func userTyping(event: Event) { if let channelID = event.channel?.id, userID = event.user?.id { - if let _ = Client.sharedInstance.channels[channelID] { - if (!Client.sharedInstance.channels[channelID]!.usersTyping.contains(userID)) { - Client.sharedInstance.channels[channelID]?.usersTyping.append(userID) + if let _ = client.channels[channelID] { + if (!client.channels[channelID]!.usersTyping.contains(userID)) { + client.channels[channelID]?.usersTyping.append(userID) - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.userTyping(event.channel, user: event.user) } } @@ -94,222 +98,222 @@ internal struct EventHandler { let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC))) dispatch_after(timeout, dispatch_get_main_queue()) { - if let index = Client.sharedInstance.channels[channelID]?.usersTyping.indexOf(userID) { - Client.sharedInstance.channels[channelID]?.usersTyping.removeAtIndex(index) + if let index = self.client.channels[channelID]?.usersTyping.indexOf(userID) { + self.client.channels[channelID]?.usersTyping.removeAtIndex(index) } } } } - static func channelMarked(event: Event) { + func channelMarked(event: Event) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels[id]?.lastRead = event.ts + client.channels[id]?.lastRead = event.ts - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelMarked(channel, timestamp: event.ts) } } //TODO: Recalculate unreads } - static func channelCreated(event: Event) { + func channelCreated(event: Event) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels[id] = channel + client.channels[id] = channel - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelCreated(channel) } } } - static func channelDeleted(event: Event) { + func channelDeleted(event: Event) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels.removeValueForKey(id) + client.channels.removeValueForKey(id) - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelDeleted(channel) } } } - static func channelJoined(event: Event) { + func channelJoined(event: Event) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels[id] = event.channel + client.channels[id] = event.channel - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelJoined(channel) } } } - static func channelLeft(event: Event) { - if let channel = event.channel, id = channel.id, userID = Client.sharedInstance.authenticatedUser?.id { - if let index = Client.sharedInstance.channels[id]?.members.indexOf(userID) { - Client.sharedInstance.channels[id]?.members.removeAtIndex(index) + func channelLeft(event: Event) { + if let channel = event.channel, id = channel.id, userID = client.authenticatedUser?.id { + if let index = client.channels[id]?.members.indexOf(userID) { + client.channels[id]?.members.removeAtIndex(index) - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelLeft(channel) } } } } - static func channelRenamed(event: Event) { + func channelRenamed(event: Event) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels[id]?.name = channel.name + client.channels[id]?.name = channel.name - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelRenamed(channel) } } } - static func channelArchived(event: Event, archived: Bool) { + func channelArchived(event: Event, archived: Bool) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels[id]?.isArchived = archived + client.channels[id]?.isArchived = archived - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelArchived(channel) } } } - static func channelHistoryChanged(event: Event) { + func channelHistoryChanged(event: Event) { if let channel = event.channel { //TODO: Reload chat history if there are any cached messages before latest - if let delegate = Client.sharedInstance.channelEventsDelegate { + if let delegate = client.channelEventsDelegate { delegate.channelHistoryChanged(channel) } } } //MARK: - Do Not Disturb - static func doNotDisturbUpdated(event: Event) { + func doNotDisturbUpdated(event: Event) { if let dndStatus = event.dndStatus { - Client.sharedInstance.authenticatedUser?.doNotDisturbStatus = dndStatus + client.authenticatedUser?.doNotDisturbStatus = dndStatus - if let delegate = Client.sharedInstance.doNotDisturbEventsDelegate { + if let delegate = client.doNotDisturbEventsDelegate { delegate.doNotDisturbUpdated(dndStatus) } } } - static func doNotDisturbUserUpdated(event: Event) { + func doNotDisturbUserUpdated(event: Event) { if let dndStatus = event.dndStatus, user = event.user, id = user.id { - Client.sharedInstance.users[id]?.doNotDisturbStatus = dndStatus + client.users[id]?.doNotDisturbStatus = dndStatus - if let delegate = Client.sharedInstance.doNotDisturbEventsDelegate { + if let delegate = client.doNotDisturbEventsDelegate { delegate.doNotDisturbUserUpdated(dndStatus, user: user) } } } //MARK: - IM & Group Open/Close - static func open(event: Event, open: Bool) { + func open(event: Event, open: Bool) { if let channel = event.channel, id = channel.id { - Client.sharedInstance.channels[id]?.isOpen = open + client.channels[id]?.isOpen = open - if let delegate = Client.sharedInstance.groupEventsDelegate { + if let delegate = client.groupEventsDelegate { delegate.groupOpened(channel) } } } //MARK: - Files - static func processFile(event: Event) { + func processFile(event: Event) { if let file = event.file, id = file.id { if let comment = file.initialComment, commentID = comment.id { - if Client.sharedInstance.files[id]?.comments[commentID] == nil { - Client.sharedInstance.files[id]?.comments[commentID] = comment + if client.files[id]?.comments[commentID] == nil { + client.files[id]?.comments[commentID] = comment } } - Client.sharedInstance.files[id] = file + client.files[id] = file - if let delegate = Client.sharedInstance.fileEventsDelegate { + if let delegate = client.fileEventsDelegate { delegate.fileProcessed(file) } } } - static func filePrivate(event: Event) { + func filePrivate(event: Event) { if let file = event.file, id = file.id { - Client.sharedInstance.files[id]?.isPublic = false + client.files[id]?.isPublic = false - if let delegate = Client.sharedInstance.fileEventsDelegate { + if let delegate = client.fileEventsDelegate { delegate.fileMadePrivate(file) } } } - static func deleteFile(event: Event) { + func deleteFile(event: Event) { if let file = event.file, id = file.id { - if Client.sharedInstance.files[id] != nil { - Client.sharedInstance.files.removeValueForKey(id) + if client.files[id] != nil { + client.files.removeValueForKey(id) } - if let delegate = Client.sharedInstance.fileEventsDelegate { + if let delegate = client.fileEventsDelegate { delegate.fileDeleted(file) } } } - static func fileCommentAdded(event: Event) { + func fileCommentAdded(event: Event) { if let file = event.file, id = file.id, comment = event.comment, commentID = comment.id { - Client.sharedInstance.files[id]?.comments[commentID] = comment + client.files[id]?.comments[commentID] = comment - if let delegate = Client.sharedInstance.fileEventsDelegate { + if let delegate = client.fileEventsDelegate { delegate.fileCommentAdded(file, comment: comment) } } } - static func fileCommentEdited(event: Event) { + func fileCommentEdited(event: Event) { if let file = event.file, id = file.id, comment = event.comment, commentID = comment.id { - Client.sharedInstance.files[id]?.comments[commentID]?.comment = comment.comment + client.files[id]?.comments[commentID]?.comment = comment.comment - if let delegate = Client.sharedInstance.fileEventsDelegate { + if let delegate = client.fileEventsDelegate { delegate.fileCommentEdited(file, comment: comment) } } } - static func fileCommentDeleted(event: Event) { + func fileCommentDeleted(event: Event) { if let file = event.file, id = file.id, comment = event.comment, commentID = comment.id { - Client.sharedInstance.files[id]?.comments.removeValueForKey(commentID) + client.files[id]?.comments.removeValueForKey(commentID) - if let delegate = Client.sharedInstance.fileEventsDelegate { + if let delegate = client.fileEventsDelegate { delegate.fileCommentDeleted(file, comment: comment) } } } //MARK: - Pins - static func pinAdded(event: Event) { + func pinAdded(event: Event) { if let id = event.channelID, item = event.item { - Client.sharedInstance.channels[id]?.pinnedItems.append(item) + client.channels[id]?.pinnedItems.append(item) - if let delegate = Client.sharedInstance.pinEventsDelegate { - delegate.itemPinned(item, channel: Client.sharedInstance.channels[id]) + if let delegate = client.pinEventsDelegate { + delegate.itemPinned(item, channel: client.channels[id]) } } } - static func pinRemoved(event: Event) { + func pinRemoved(event: Event) { if let id = event.channelID { - if let pins = Client.sharedInstance.channels[id]?.pinnedItems.filter({$0 != event.item}) { - Client.sharedInstance.channels[id]?.pinnedItems = pins + if let pins = client.channels[id]?.pinnedItems.filter({$0 != event.item}) { + client.channels[id]?.pinnedItems = pins } - if let delegate = Client.sharedInstance.pinEventsDelegate { - delegate.itemUnpinned(event.item, channel: Client.sharedInstance.channels[id]) + if let delegate = client.pinEventsDelegate { + delegate.itemUnpinned(event.item, channel: client.channels[id]) } } } //MARK: - Stars - static func itemStarred(event: Event, star: Bool) { + func itemStarred(event: Event, star: Bool) { if let item = event.item, type = item.type { switch type { case "message": @@ -322,48 +326,48 @@ internal struct EventHandler { break } - if let delegate = Client.sharedInstance.starEventsDelegate { + if let delegate = client.starEventsDelegate { delegate.itemStarred(item, star: star) } } } - static func starMessage(item: Item, star: Bool) { + func starMessage(item: Item, star: Bool) { if let message = item.message, ts = message.ts, channel = item.channel { - if let _ = Client.sharedInstance.channels[channel]?.messages[ts] { - Client.sharedInstance.channels[channel]?.messages[ts]?.isStarred = star + if let _ = client.channels[channel]?.messages[ts] { + client.channels[channel]?.messages[ts]?.isStarred = star } } } - static func starFile(item: Item, star: Bool) { + func starFile(item: Item, star: Bool) { if let file = item.file, id = file.id { - Client.sharedInstance.files[id]?.isStarred = star - if let stars = Client.sharedInstance.files[id]?.stars { + client.files[id]?.isStarred = star + if let stars = client.files[id]?.stars { if star == true { - Client.sharedInstance.files[id]?.stars = stars + 1 + client.files[id]?.stars = stars + 1 } else { if stars > 0 { - Client.sharedInstance.files[id]?.stars = stars - 1 + client.files[id]?.stars = stars - 1 } } } } } - static func starComment(item: Item) { + func starComment(item: Item) { if let file = item.file, id = file.id, comment = item.comment, commentID = comment.id { - Client.sharedInstance.files[id]?.comments[commentID] = comment + client.files[id]?.comments[commentID] = comment } } //MARK: - Reactions - static func addedReaction(event: Event) { + func addedReaction(event: Event) { if let item = event.item, type = item.type, key = event.reaction, userID = event.user?.id { switch type { case "message": if let channel = item.channel, ts = item.ts { - if let message = Client.sharedInstance.channels[channel]?.messages[ts] { + if let message = client.channels[channel]?.messages[ts] { if (message.reactions[key]) == nil { message.reactions[key] = Reaction(name: event.reaction, user: userID) } else { @@ -372,19 +376,19 @@ internal struct EventHandler { } } case "file": - if let id = item.file?.id, file = Client.sharedInstance.files[id] { + if let id = item.file?.id, file = client.files[id] { if file.reactions[key] == nil { - Client.sharedInstance.files[id]?.reactions[key] = Reaction(name: event.reaction, user: userID) + client.files[id]?.reactions[key] = Reaction(name: event.reaction, user: userID) } else { - Client.sharedInstance.files[id]?.reactions[key]?.users[userID] = userID + client.files[id]?.reactions[key]?.users[userID] = userID } } case "file_comment": - if let id = item.file?.id, file = Client.sharedInstance.files[id], commentID = item.fileCommentID { + if let id = item.file?.id, file = client.files[id], commentID = item.fileCommentID { if file.comments[commentID]?.reactions[key] == nil { - Client.sharedInstance.files[id]?.comments[commentID]?.reactions[key] = Reaction(name: event.reaction, user: userID) + client.files[id]?.comments[commentID]?.reactions[key] = Reaction(name: event.reaction, user: userID) } else { - Client.sharedInstance.files[id]?.comments[commentID]?.reactions[key]?.users[userID] = userID + client.files[id]?.comments[commentID]?.reactions[key]?.users[userID] = userID } } break @@ -392,18 +396,18 @@ internal struct EventHandler { break } - if let delegate = Client.sharedInstance.reactionEventsDelegate { + if let delegate = client.reactionEventsDelegate { delegate.reactionAdded(event.reaction, item: event.item) } } } - static func removedReaction(event: Event) { + func removedReaction(event: Event) { if let item = event.item, type = item.type, key = event.reaction, userID = event.user?.id { switch type { case "message": if let channel = item.channel, ts = item.ts { - if let message = Client.sharedInstance.channels[channel]?.messages[ts] { + if let message = client.channels[channel]?.messages[ts] { if (message.reactions[key]) != nil { message.reactions[key]?.users.removeValueForKey(userID) } @@ -413,21 +417,21 @@ internal struct EventHandler { } } case "file": - if let itemFile = item.file, id = itemFile.id, file = Client.sharedInstance.files[id] { + if let itemFile = item.file, id = itemFile.id, file = client.files[id] { if file.reactions[key] != nil { - Client.sharedInstance.files[id]?.reactions[key]?.users.removeValueForKey(userID) + client.files[id]?.reactions[key]?.users.removeValueForKey(userID) } - if Client.sharedInstance.files[id]?.reactions[key]?.users.count == 0 { - Client.sharedInstance.files[id]?.reactions.removeValueForKey(key) + if client.files[id]?.reactions[key]?.users.count == 0 { + client.files[id]?.reactions.removeValueForKey(key) } } case "file_comment": - if let id = item.file?.id, file = Client.sharedInstance.files[id], commentID = item.fileCommentID { + if let id = item.file?.id, file = client.files[id], commentID = item.fileCommentID { if file.comments[commentID]?.reactions[key] != nil { - Client.sharedInstance.files[id]?.comments[commentID]?.reactions[key]?.users.removeValueForKey(userID) + client.files[id]?.comments[commentID]?.reactions[key]?.users.removeValueForKey(userID) } - if Client.sharedInstance.files[id]?.comments[commentID]?.reactions[key]?.users.count == 0 { - Client.sharedInstance.files[id]?.comments[commentID]?.reactions.removeValueForKey(key) + if client.files[id]?.comments[commentID]?.reactions[key]?.users.count == 0 { + client.files[id]?.comments[commentID]?.reactions.removeValueForKey(key) } } break @@ -435,165 +439,165 @@ internal struct EventHandler { break } - if let delegate = Client.sharedInstance.reactionEventsDelegate { + if let delegate = client.reactionEventsDelegate { delegate.reactionAdded(event.reaction, item: event.item) } } } //MARK: - Preferences - static func changePreference(event: Event) { + func changePreference(event: Event) { if let name = event.name { - Client.sharedInstance.authenticatedUser?.preferences?[name] = event.value + client.authenticatedUser?.preferences?[name] = event.value - if let delegate = Client.sharedInstance.slackEventsDelegate, value = event.value { + if let delegate = client.slackEventsDelegate, value = event.value { delegate.preferenceChanged(name, value: value) } } } //Mark: - User Change - static func userChange(event: Event) { + func userChange(event: Event) { if let user = event.user, id = user.id { - let preferences = Client.sharedInstance.users[id]?.preferences - Client.sharedInstance.users[id] = user - Client.sharedInstance.users[id]?.preferences = preferences + let preferences = client.users[id]?.preferences + client.users[id] = user + client.users[id]?.preferences = preferences - if let delegate = Client.sharedInstance.slackEventsDelegate { + if let delegate = client.slackEventsDelegate { delegate.userChanged(user) } } } //MARK: - User Presence - static func presenceChange(event: Event) { + func presenceChange(event: Event) { if let user = event.user, id = user.id { - Client.sharedInstance.users[id]?.presence = event.presence + client.users[id]?.presence = event.presence - if let delegate = Client.sharedInstance.slackEventsDelegate { + if let delegate = client.slackEventsDelegate { delegate.presenceChanged(user, presence: event.presence) } } } //MARK: - Team - static func teamJoin(event: Event) { + func teamJoin(event: Event) { if let user = event.user, id = user.id { - Client.sharedInstance.users[id] = user + client.users[id] = user - if let delegate = Client.sharedInstance.teamEventsDelegate { + if let delegate = client.teamEventsDelegate { delegate.teamJoined(user) } } } - static func teamPlanChange(event: Event) { + func teamPlanChange(event: Event) { if let plan = event.plan { - Client.sharedInstance.team?.plan = plan + client.team?.plan = plan - if let delegate = Client.sharedInstance.teamEventsDelegate { + if let delegate = client.teamEventsDelegate { delegate.teamPlanChanged(plan) } } } - static func teamPreferenceChange(event: Event) { + func teamPreferenceChange(event: Event) { if let name = event.name { - Client.sharedInstance.team?.prefs?[name] = event.value + client.team?.prefs?[name] = event.value - if let delegate = Client.sharedInstance.teamEventsDelegate, value = event.value { + if let delegate = client.teamEventsDelegate, value = event.value { delegate.teamPreferencesChanged(name, value: value) } } } - static func teamNameChange(event: Event) { + func teamNameChange(event: Event) { if let name = event.name { - Client.sharedInstance.team?.name = name + client.team?.name = name - if let delegate = Client.sharedInstance.teamEventsDelegate { + if let delegate = client.teamEventsDelegate { delegate.teamNameChanged(name) } } } - static func teamDomainChange(event: Event) { + func teamDomainChange(event: Event) { if let domain = event.domain { - Client.sharedInstance.team?.domain = domain + client.team?.domain = domain - if let delegate = Client.sharedInstance.teamEventsDelegate { + if let delegate = client.teamEventsDelegate { delegate.teamDomainChanged(domain) } } } - static func emailDomainChange(event: Event) { + func emailDomainChange(event: Event) { if let domain = event.emailDomain { - Client.sharedInstance.team?.emailDomain = domain + client.team?.emailDomain = domain - if let delegate = Client.sharedInstance.teamEventsDelegate { + if let delegate = client.teamEventsDelegate { delegate.teamEmailDomainChanged(domain) } } } - static func emojiChanged(event: Event) { + func emojiChanged(event: Event) { //TODO: Call emoji.list here - if let delegate = Client.sharedInstance.teamEventsDelegate { + if let delegate = client.teamEventsDelegate { delegate.teamEmojiChanged() } } //MARK: - Bots - static func bot(event: Event) { + func bot(event: Event) { if let bot = event.bot, id = bot.id { - Client.sharedInstance.bots[id] = bot + client.bots[id] = bot - if let delegate = Client.sharedInstance.slackEventsDelegate { + if let delegate = client.slackEventsDelegate { delegate.botEvent(bot) } } } //MARK: - Subteams - static func subteam(event: Event) { + func subteam(event: Event) { if let subteam = event.subteam, id = subteam.id { - Client.sharedInstance.userGroups[id] = subteam + client.userGroups[id] = subteam - if let delegate = Client.sharedInstance.subteamEventsDelegate { + if let delegate = client.subteamEventsDelegate { delegate.subteamEvent(subteam) } } } - static func subteamAddedSelf(event: Event) { - if let subteamID = event.subteamID, _ = Client.sharedInstance.authenticatedUser?.userGroups { - Client.sharedInstance.authenticatedUser?.userGroups![subteamID] = subteamID + func subteamAddedSelf(event: Event) { + if let subteamID = event.subteamID, _ = client.authenticatedUser?.userGroups { + client.authenticatedUser?.userGroups![subteamID] = subteamID - if let delegate = Client.sharedInstance.subteamEventsDelegate { + if let delegate = client.subteamEventsDelegate { delegate.subteamSelfAdded(subteamID) } } } - static func subteamRemovedSelf(event: Event) { + func subteamRemovedSelf(event: Event) { if let subteamID = event.subteamID { - Client.sharedInstance.authenticatedUser?.userGroups?.removeValueForKey(subteamID) + client.authenticatedUser?.userGroups?.removeValueForKey(subteamID) - if let delegate = Client.sharedInstance.subteamEventsDelegate { + if let delegate = client.subteamEventsDelegate { delegate.subteamSelfRemoved(subteamID) } } } //MARK: - Authenticated User - static func manualPresenceChange(event: Event) { - Client.sharedInstance.authenticatedUser?.presence = event.presence + func manualPresenceChange(event: Event) { + client.authenticatedUser?.presence = event.presence - if let delegate = Client.sharedInstance.slackEventsDelegate { - delegate.manualPresenceChanged(Client.sharedInstance.authenticatedUser, presence: event.presence) + if let delegate = client.slackEventsDelegate { + delegate.manualPresenceChanged(client.authenticatedUser, presence: event.presence) } }