This commit is contained in:
Peter Zignego
2016-09-14 21:39:32 -04:00
parent 183ed91cb8
commit ca444930a4
19 changed files with 323 additions and 322 deletions
+1
View File
@@ -16,6 +16,7 @@ DerivedData
*.hmap
*.ipa
*.xcuserstate
*.DS_Store
# SwiftPM
Packages/
+2 -2
View File
@@ -1,2 +1,2 @@
github "https://github.com/pvzig/swifter.git" "master"
github "https://github.com/pvzig/Starscream.git" "swift3"
git "/Users/pzignego/Repositories/swifter" "xcode8b6"
git "/Users/pzignego/Repositories/Starscream" "xcode8b6"
+2 -2
View File
@@ -1,2 +1,2 @@
github "pvzig/Starscream" "2fde5c5eb9302439e634753c3aacc794ca2e42e8"
github "pvzig/swifter" "ddbebdde19360a2c9e4e01e5a0642dd12082cc92"
git "/Users/pzignego/Repositories/Starscream" "34ed78556478730252d77cab878ff5aa2fda7fe4"
git "/Users/pzignego/Repositories/swifter" "0b4fadaca0011da031730f225357f2b87f6e68fa"
+10 -10
View File
@@ -50,12 +50,12 @@ public struct Action {
internal func dictionary() -> [String: AnyObject] {
var dict = [String: AnyObject]()
dict["name"] = name
dict["text"] = text
dict["type"] = type
dict["value"] = value
dict["style"] = style?.rawValue
dict["confirm"] = confirm?.dictionary()
dict["name"] = name as AnyObject?
dict["text"] = text as AnyObject?
dict["type"] = type as AnyObject?
dict["value"] = value as AnyObject?
dict["style"] = style?.rawValue as AnyObject?
dict["confirm"] = confirm?.dictionary() as AnyObject?
return dict
}
@@ -82,10 +82,10 @@ public struct Action {
internal func dictionary() -> [String: AnyObject] {
var dict = [String: AnyObject]()
dict["title"] = title
dict["text"] = text
dict["ok_text"] = okText
dict["dismiss_text"] = dismissText
dict["title"] = title as AnyObject?
dict["text"] = text as AnyObject?
dict["ok_text"] = okText as AnyObject?
dict["dismiss_text"] = dismissText as AnyObject?
return dict
}
+18 -18
View File
@@ -86,24 +86,24 @@ public struct Attachment {
internal func dictionary() -> [String: AnyObject] {
var attachment = [String: AnyObject]()
attachment["fallback"] = fallback
attachment["callback_id"] = callbackID
attachment["attachment_type"] = type
attachment["color"] = color
attachment["pretext"] = pretext
attachment["authorName"] = authorName
attachment["author_link"] = authorLink
attachment["author_icon"] = authorIcon
attachment["title"] = title
attachment["title_link"] = titleLink
attachment["text"] = text
attachment["fields"] = fields?.map{$0.dictionary()}
attachment["actions"] = actions?.map{$0.dictionary()}
attachment["image_url"] = imageURL
attachment["thumb_url"] = thumbURL
attachment["footer"] = footer
attachment["footer_icon"] = footerIcon
attachment["ts"] = ts
attachment["fallback"] = fallback as AnyObject?
attachment["callback_id"] = callbackID as AnyObject?
attachment["attachment_type"] = type as AnyObject?
attachment["color"] = color as AnyObject?
attachment["pretext"] = pretext as AnyObject?
attachment["authorName"] = authorName as AnyObject?
attachment["author_link"] = authorLink as AnyObject?
attachment["author_icon"] = authorIcon as AnyObject?
attachment["title"] = title as AnyObject?
attachment["title_link"] = titleLink as AnyObject?
attachment["text"] = text as AnyObject?
attachment["fields"] = fields?.map{$0.dictionary()} as AnyObject?
attachment["actions"] = actions?.map{$0.dictionary()} as AnyObject?
attachment["image_url"] = imageURL as AnyObject?
attachment["thumb_url"] = thumbURL as AnyObject?
attachment["footer"] = footer as AnyObject?
attachment["footer_icon"] = footerIcon as AnyObject?
attachment["ts"] = ts as AnyObject?
return attachment
}
+3 -3
View File
@@ -41,9 +41,9 @@ public struct AttachmentField {
internal func dictionary() -> [String: AnyObject] {
var field = [String: AnyObject]()
field["title"] = title
field["value"] = value
field["short"] = short
field["title"] = title as AnyObject?
field["value"] = value as AnyObject?
field["short"] = short as AnyObject?
return field
}
+3 -3
View File
@@ -31,9 +31,9 @@ internal struct AuthorizeRequest {
var parameters: [String: AnyObject] {
var json = [String : AnyObject]()
json["scope"] = scope.map({$0.rawValue}).joined(separator: ",")
json["state"] = state
json["team"] = team
json["scope"] = scope.map({$0.rawValue}).joined(separator: ",") as AnyObject?
json["state"] = state as AnyObject?
json["team"] = team as AnyObject?
return json
}
@@ -144,7 +144,7 @@ internal extension Client {
// Other clients should ignore this event.
break
case .TeamMigrationStarted:
connect(options: options ?? ClientOptions())
connect(options ?? ClientOptions())
case .ReconnectURL:
// The reconnect_url event is currently unsupported and experimental.
break
+2 -2
View File
@@ -43,11 +43,11 @@ public extension Client {
return id
}
public func getImIDForUserWithID(_ id: String, success: (imID: String?)->Void, failure: (error: SlackError)->Void) {
public func getImIDForUserWithID(_ id: String, success: @escaping (_ imID: String?)->Void, failure: @escaping (SlackError)->Void) {
let ims = channels.filter{$0.1.isIM == true}
let channel = ims.filter{$0.1.user == id}.first
if let channel = channel {
success(imID: channel.0)
success(channel.0)
} else {
webAPI.openIM(id, success: success, failure: failure)
}
+24 -24
View File
@@ -44,7 +44,7 @@ public final class Client: WebSocketDelegate {
}
internal var webSocket: WebSocket?
private let pingPongQueue = DispatchQueue(label: "com.launchsoft.SlackKit")
fileprivate let pingPongQueue = DispatchQueue(label: "com.launchsoft.SlackKit")
internal var ping: Double?
internal var pong: Double?
internal var options: ClientOptions?
@@ -73,7 +73,7 @@ public final class Client: WebSocketDelegate {
self.token = token
}
public func connect(options: ClientOptions = ClientOptions()) {
public func connect(_ options: ClientOptions = ClientOptions()) {
self.options = options
webAPI.rtmStart(options.simpleLatest, noUnreads: options.noUnreads, mpimAware: options.mpimAware, success: {
(response) -> Void in
@@ -102,31 +102,31 @@ public final class Client: WebSocketDelegate {
}
}
private func formatMessageToSlackJsonString(_ message: (msg: String, channel: String)) throws -> Data {
fileprivate func formatMessageToSlackJsonString(_ message: (msg: String, channel: String)) throws -> Data {
let json: [String: AnyObject] = [
"id": Date().slackTimestamp(),
"type": "message",
"channel": message.channel,
"text": message.msg.slackFormatEscaping()
"id": Date().slackTimestamp() as AnyObject,
"type": "message" as AnyObject,
"channel": message.channel as AnyObject,
"text": message.msg.slackFormatEscaping() as AnyObject
]
addSentMessage(json)
return try JSONSerialization.data(withJSONObject: json, options: [])
}
private func addSentMessage(_ dictionary: [String: AnyObject]) {
fileprivate func addSentMessage(_ dictionary: [String: AnyObject]) {
var message = dictionary
guard let id = message["id"] as? NSNumber else {
return
}
let ts = String(id)
let ts = String(describing: id)
message.removeValue(forKey: "id")
message["ts"] = ts
message["user"] = self.authenticatedUser?.id
message["ts"] = ts as AnyObject?
message["user"] = self.authenticatedUser?.id as AnyObject?
sentMessages[ts] = Message(message: message)
}
//MARK: - RTM Ping
private func pingRTMServerAtInterval(_ interval: TimeInterval) {
fileprivate func pingRTMServerAtInterval(_ interval: TimeInterval) {
let delay = DispatchTime.now() + Double(Int64(interval * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
pingPongQueue.asyncAfter(deadline: delay, execute: {
guard self.connected && self.timeoutCheck() else {
@@ -138,13 +138,13 @@ public final class Client: WebSocketDelegate {
})
}
private func sendRTMPing() {
fileprivate func sendRTMPing() {
guard connected else {
return
}
let json: [String: AnyObject] = [
"id": Date().slackTimestamp(),
"type": "ping",
"id": Date().slackTimestamp() as AnyObject,
"type": "ping" as AnyObject,
]
guard let data = try? JSONSerialization.data(withJSONObject: json, options: []) else {
return
@@ -155,7 +155,7 @@ public final class Client: WebSocketDelegate {
}
}
private func timeoutCheck() -> Bool {
fileprivate func timeoutCheck() -> Bool {
if let pong = pong, let ping = ping, let timeout = options?.timeout {
if pong - ping < timeout {
return true
@@ -169,7 +169,7 @@ public final class Client: WebSocketDelegate {
}
//MARK: - Client setup
private func initialSetup(_ json: [String: AnyObject]) {
fileprivate func initialSetup(_ json: [String: AnyObject]) {
team = Team(team: json["team"] as? [String: AnyObject])
authenticatedUser = User(user: json["self"] as? [String: AnyObject])
authenticatedUser?.doNotDisturbStatus = DoNotDisturbStatus(status: json["dnd"] as? [String: AnyObject])
@@ -182,28 +182,28 @@ public final class Client: WebSocketDelegate {
enumerateSubteams(json["subteams"] as? [String: AnyObject])
}
private func addUser(_ aUser: [String: AnyObject]) {
fileprivate func addUser(_ aUser: [String: AnyObject]) {
let user = User(user: aUser)
if let id = user.id {
users[id] = user
}
}
private func addChannel(_ aChannel: [String: AnyObject]) {
fileprivate func addChannel(_ aChannel: [String: AnyObject]) {
let channel = Channel(channel: aChannel)
if let id = channel.id {
channels[id] = channel
}
}
private func addBot(_ aBot: [String: AnyObject]) {
fileprivate func addBot(_ aBot: [String: AnyObject]) {
let bot = Bot(bot: aBot)
if let id = bot.id {
bots[id] = bot
}
}
private func enumerateSubteams(_ subteams: [String: AnyObject]?) {
fileprivate func enumerateSubteams(_ subteams: [String: AnyObject]?) {
if let subteams = subteams {
if let all = subteams["all"] as? [[String: AnyObject]] {
for item in all {
@@ -221,7 +221,7 @@ public final class Client: WebSocketDelegate {
}
// MARK: - Utilities
private func enumerateObjects(_ array: [AnyObject]?, initalizer: ([String: AnyObject])-> Void) {
fileprivate func enumerateObjects(_ array: [AnyObject]?, initalizer: ([String: AnyObject])-> Void) {
if let array = array {
for object in array {
if let dictionary = object as? [String: AnyObject] {
@@ -232,7 +232,7 @@ public final class Client: WebSocketDelegate {
}
// MARK: - WebSocketDelegate
public func websocketDidConnect(socket: WebSocket) {
public func websocketDidConnect(_ socket: WebSocket) {
if let pingInterval = options?.pingInterval {
pingRTMServerAtInterval(pingInterval)
}
@@ -244,7 +244,7 @@ public final class Client: WebSocketDelegate {
authenticatedUser = nil
connectionEventsDelegate?.clientDisconnected(self)
if let options = options, options.reconnect == true {
connect(options: options)
connect(options)
}
}
+5 -5
View File
@@ -60,12 +60,12 @@ public struct IncomingWebhook {
}
}
private func jsonBody(_ response: [String: AnyObject]) -> [String: AnyObject] {
fileprivate func jsonBody(_ response: [String: AnyObject]) -> [String: AnyObject] {
var json = response
json["channel"] = channel
json["username"] = username
json["icon_emoji"] = iconEmoji
json["icon_url"] = iconURL
json["channel"] = channel as AnyObject?
json["username"] = username as AnyObject?
json["icon_emoji"] = iconEmoji as AnyObject?
json["icon_url"] = iconURL as AnyObject?
return json
}
+1 -1
View File
@@ -21,7 +21,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
public class MessageActionServer: Server {
open class MessageActionServer: Server {
internal let responder: MessageActionResponder
+13 -13
View File
@@ -27,7 +27,7 @@ internal struct NetworkInterface {
private let apiUrl = "https://slack.com/api/"
internal func request(_ endpoint: Endpoint, token: String? = nil, parameters: [String: AnyObject]?, successClosure: ([String: AnyObject])->Void, errorClosure: (SlackError)->Void) {
internal func request(_ endpoint: Endpoint, token: String? = nil, parameters: [String: AnyObject]?, successClosure: @escaping ([String: AnyObject])->Void, errorClosure: @escaping (SlackError)->Void) {
var requestString = "\(apiUrl)\(endpoint.rawValue)?"
if let token = token {
requestString += "token=\(token)"
@@ -42,15 +42,15 @@ internal struct NetworkInterface {
let request = URLRequest(url:url)
URLSession.shared.dataTask(with: request) {
(data, response, internalError) -> Void in
self.handleResponse(data, response: response, internalError: internalError, successClosure: {(json) in
successClosure(json)
}, errorClosure: {(error) in
errorClosure(error)
})
// self.handleResponse(data, response: response, internalError: internalError, successClosure: {(json) in
// successClosure(json)
// }, errorClosure: {(error) in
// errorClosure(error)
// })
}.resume()
}
internal func customRequest(_ url: String, data: Data, success: (Bool)->Void, errorClosure: (SlackError)->Void) {
internal func customRequest(_ url: String, data: Data, success: @escaping (Bool)->Void, errorClosure: @escaping (SlackError)->Void) {
guard let url = URL(string: url.removePercentEncoding()) else {
errorClosure(SlackError.ClientNetworkError)
return
@@ -71,7 +71,7 @@ internal struct NetworkInterface {
}.resume()
}
internal func uploadRequest(_ token: String, data: Data, parameters: [String: AnyObject]?, successClosure: ([String: AnyObject])->Void, errorClosure: (SlackError)->Void) {
internal func uploadRequest(_ token: String, data: Data, parameters: [String: AnyObject]?, successClosure: @escaping ([String: AnyObject])->Void, errorClosure: @escaping (SlackError)->Void) {
var requestString = "\(apiUrl)\(Endpoint.FilesUpload.rawValue)?token=\(token)"
if let params = parameters {
requestString = requestString + params.requestStringFromParameters
@@ -102,11 +102,11 @@ internal struct NetworkInterface {
URLSession.shared.dataTask(with: request) {
(data, response, internalError) -> Void in
self.handleResponse(data, response: response, internalError: internalError, successClosure: {(json) in
successClosure(json)
}, errorClosure: {(error) in
errorClosure(error)
})
// self.handleResponse(data, response: response, internalError: internalError, successClosure: {(json) in
// successClosure(json)
// }, errorClosure: {(error) in
// errorClosure(error)
// })
}.resume()
}
+9 -9
View File
@@ -30,14 +30,14 @@ internal protocol OAuthDelegate {
public struct OAuthServer {
private let oauthURL = "https://slack.com/oauth/authorize"
fileprivate let oauthURL = "https://slack.com/oauth/authorize"
private let http = HttpServer()
private let clientID: String
private let clientSecret: String
private let state: String?
private let redirectURI: String?
private var delegate: OAuthDelegate?
fileprivate let http = HttpServer()
fileprivate let clientID: String
fileprivate let clientSecret: String
fileprivate let state: String?
fileprivate let redirectURI: String?
fileprivate var delegate: OAuthDelegate?
internal init(clientID: String, clientSecret: String, state: String? = nil, redirectURI: String? = nil, port:in_port_t = 8080, forceIPV4: Bool = false, delegate: OAuthDelegate? = nil) throws {
self.clientID = clientID
@@ -61,7 +61,7 @@ public struct OAuthServer {
http.stop()
}
private func oauthRoute() {
fileprivate func oauthRoute() {
http["/oauth"] = { request in
guard let response = AuthorizeResponse(queryParameters: request.queryParams), response.state == self.state else {
return .badRequest(.text("Bad request."))
@@ -78,7 +78,7 @@ public struct OAuthServer {
}
}
private func oauthURLRequest(_ authorize: AuthorizeRequest) -> URLRequest? {
fileprivate func oauthURLRequest(_ authorize: AuthorizeRequest) -> URLRequest? {
var requestString = "\(oauthURL)?client_id=\(authorize.clientID)"
requestString += authorize.parameters.requestStringFromParameters
guard let url = URL(string: requestString) else {
+3 -3
View File
@@ -35,9 +35,9 @@ public struct Response {
internal func json() -> [String: AnyObject] {
var json = [String : AnyObject]()
json["text"] = text
json["response_type"] = responseType?.rawValue
json["attachments"] = attachments?.map({$0.dictionary()})
json["text"] = text as AnyObject?
json["response_type"] = responseType?.rawValue as AnyObject?
json["attachments"] = attachments?.map({$0.dictionary()}) as AnyObject?
return json
}
+4 -4
View File
@@ -34,7 +34,7 @@ internal protocol Request {
var responseURL: String { get }
}
public class Server {
open class Server {
internal let http = HttpServer()
internal let token: String
@@ -43,7 +43,7 @@ public class Server {
self.token = token
}
public func start(_ port: in_port_t = 8080, forceIPV4: Bool = false) {
open func start(_ port: in_port_t = 8080, forceIPV4: Bool = false) {
do {
try http.start(port, forceIPv4: forceIPV4)
} catch let error as NSError {
@@ -51,7 +51,7 @@ public class Server {
}
}
public func stop() {
open func stop() {
http.stop()
}
@@ -73,7 +73,7 @@ public class Server {
for argument in body {
let kv = argument.components(separatedBy: "=")
if let key = kv.first, let value = kv.last {
dict[key] = value
dict[key] = value as AnyObject?
}
}
return dict
+3 -3
View File
@@ -27,7 +27,7 @@ public final class SlackKit: OAuthDelegate {
internal(set) public var oauth: OAuthServer?
internal(set) public var clients: [String: Client] = [:]
private let clientOptions: ClientOptions
fileprivate let clientOptions: ClientOptions
// Initalization block
public var onClientInitalization: ((Client) -> Void)?
@@ -39,7 +39,7 @@ public final class SlackKit: OAuthDelegate {
self.onClientInitalization?(client)
})
clients[token] = client
client.connect(options: self.clientOptions)
client.connect(self.clientOptions)
}
// If you're going to be receiving and/or initiating OAuth requests, provide a client ID and secret
@@ -60,7 +60,7 @@ public final class SlackKit: OAuthDelegate {
let client = Client(apiToken: token)
self.onClientInitalization?(client)
clients[token] = client
client.connect(options: self.clientOptions)
client.connect(self.clientOptions)
}
}
+216 -216
View File
@@ -83,7 +83,7 @@ internal enum Endpoint: String {
public final class WebAPI {
public typealias FailureClosure = (error: SlackError)->Void
public typealias FailureClosure = (_ error: SlackError)->Void
public enum InfoType: String {
case Purpose = "purpose"
@@ -100,14 +100,14 @@ public final class WebAPI {
case Away = "away"
}
private enum ChannelType: String {
fileprivate enum ChannelType: String {
case Channel = "channel"
case Group = "group"
case IM = "im"
}
private let networkInterface: NetworkInterface
private let token: String
fileprivate let networkInterface: NetworkInterface
fileprivate let token: String
public init(token: String) {
self.networkInterface = NetworkInterface()
@@ -115,179 +115,179 @@ public final class WebAPI {
}
//MARK: - RTM
public func rtmStart(_ simpleLatest: Bool? = nil, noUnreads: Bool? = nil, mpimAware: Bool? = nil, success: ((response: [String: AnyObject])->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["simple_latest": simpleLatest, "no_unreads": noUnreads, "mpim_aware": mpimAware]
public func rtmStart(_ simpleLatest: Bool? = nil, noUnreads: Bool? = nil, mpimAware: Bool? = nil, success: ((_ response: [String: AnyObject])->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["simple_latest": simpleLatest as Optional<AnyObject>, "no_unreads": noUnreads as Optional<AnyObject>, "mpim_aware": mpimAware as Optional<AnyObject>]
networkInterface.request(.RTMStart, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(response: response)
success?(response)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Auth
public func authenticationTest(_ success: ((authenticated: Bool)->Void)?, failure: FailureClosure?) {
public func authenticationTest(_ success: ((_ authenticated: Bool)->Void)?, failure: FailureClosure?) {
networkInterface.request(.AuthTest, token: token, parameters: nil, successClosure: {
(response) -> Void in
success?(authenticated: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public static func oauthAccess(_ clientID: String, clientSecret: String, code: String, redirectURI: String? = nil, success: ((response: [String: AnyObject])->Void)?, failure: ((SlackError)->Void)?) {
let parameters: [String: AnyObject?] = ["client_id": clientID, "client_secret": clientSecret, "code": code, "redirect_uri": redirectURI]
public static func oauthAccess(_ clientID: String, clientSecret: String, code: String, redirectURI: String? = nil, success: ((_ response: [String: AnyObject])->Void)?, failure: ((SlackError)->Void)?) {
let parameters: [String: AnyObject?] = ["client_id": clientID as Optional<AnyObject>, "client_secret": clientSecret as Optional<AnyObject>, "code": code as Optional<AnyObject>, "redirect_uri": redirectURI as Optional<AnyObject>]
NetworkInterface().request(.OAuthAccess, parameters: filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(response:response)
success?(response)
}) {(error) -> Void in
failure?(error)
}
}
public static func oauthRevoke(_ token: String, test: Bool? = nil, success: ((revoked:Bool)->Void)?, failure: ((SlackError)->Void)?) {
let parameters: [String: AnyObject?] = ["token": token, "test": test]
public static func oauthRevoke(_ token: String, test: Bool? = nil, success: ((_ revoked:Bool)->Void)?, failure: ((SlackError)->Void)?) {
let parameters: [String: AnyObject?] = ["token": token as Optional<AnyObject>, "test": test as Optional<AnyObject>]
NetworkInterface().request(.AuthRevoke, parameters: filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(revoked:true)
success?(true)
}) {(error) -> Void in
failure?(error)
}
}
//MARK: - Channels
public func channelHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((history: History)->Void)?, failure: FailureClosure?) {
public func channelHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((_ history: History)->Void)?, failure: FailureClosure?) {
history(.ChannelsHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
(history) -> Void in
success?(history: history)
success?(history)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func channelInfo(_ id: String, success: ((channel: Channel)->Void)?, failure: FailureClosure?) {
public func channelInfo(_ id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
info(.ChannelsInfo, type:ChannelType.Channel, id: id, success: {
(channel) -> Void in
success?(channel: channel)
success?(channel)
}) { (error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func channelsList(_ excludeArchived: Bool = false, success: ((channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
public func channelsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
list(.ChannelsList, type:ChannelType.Channel, excludeArchived: excludeArchived, success: {
(channels) -> Void in
success?(channels: channels)
success?(channels)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func markChannel(_ channel: String, timestamp: String, success: ((ts: String)->Void)?, failure: FailureClosure?) {
public func markChannel(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
mark(.ChannelsMark, channel: channel, timestamp: timestamp, success: {
(ts) -> Void in
success?(ts:timestamp)
success?(timestamp)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func setChannelPurpose(_ channel: String, purpose: String, success: ((purposeSet: Bool)->Void)?, failure: FailureClosure?) {
public func setChannelPurpose(_ channel: String, purpose: String, success: ((_ purposeSet: Bool)->Void)?, failure: FailureClosure?) {
setInfo(.ChannelsSetPurpose, type: .Purpose, channel: channel, text: purpose, success: {
(purposeSet) -> Void in
success?(purposeSet: purposeSet)
success?(purposeSet)
}) { (error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func setChannelTopic(_ channel: String, topic: String, success: ((topicSet: Bool)->Void)?, failure: FailureClosure?) {
public func setChannelTopic(_ channel: String, topic: String, success: ((_ topicSet: Bool)->Void)?, failure: FailureClosure?) {
setInfo(.ChannelsSetTopic, type: .Topic, channel: channel, text: topic, success: {
(topicSet) -> Void in
success?(topicSet: topicSet)
success?(topicSet)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Messaging
public func deleteMessage(_ channel: String, ts: String, success: ((deleted: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": channel, "ts": ts]
public func deleteMessage(_ channel: String, ts: String, success: ((_ deleted: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": channel as AnyObject, "ts": ts as AnyObject]
networkInterface.request(.ChatDelete, token: token, parameters: parameters, successClosure: { (response) -> Void in
success?(deleted: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func sendMessage(_ channel: String, text: String, username: String? = nil, asUser: Bool? = nil, parse: ParseMode? = nil, linkNames: Bool? = nil, attachments: [Attachment?]? = nil, unfurlLinks: Bool? = nil, unfurlMedia: Bool? = nil, iconURL: String? = nil, iconEmoji: String? = nil, success: (((ts: String?, channel: String?))->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["channel":channel, "text":text.slackFormatEscaping(), "as_user":asUser, "parse":parse?.rawValue, "link_names":linkNames, "unfurl_links":unfurlLinks, "unfurlMedia":unfurlMedia, "username":username, "attachments":encodeAttachments(attachments), "icon_url":iconURL, "icon_emoji":iconEmoji]
let parameters: [String: AnyObject?] = ["channel":channel as Optional<AnyObject>, "text":text.slackFormatEscaping() as Optional<AnyObject>, "as_user":asUser as Optional<AnyObject>, "parse":parse?.rawValue as Optional<AnyObject>, "link_names":linkNames as Optional<AnyObject>, "unfurl_links":unfurlLinks as Optional<AnyObject>, "unfurlMedia":unfurlMedia as Optional<AnyObject>, "username":username as Optional<AnyObject>, "icon_url":iconURL as Optional<AnyObject>, "icon_emoji":iconEmoji as Optional<AnyObject>, "attachments": encodeAttachments(attachments) as Optional<AnyObject>]
networkInterface.request(.ChatPostMessage, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?((ts: response["ts"] as? String, response["channel"] as? String))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func updateMessage(_ channel: String, ts: String, message: String, attachments: [Attachment?]? = nil, parse:ParseMode = .None, linkNames: Bool = false, success: ((updated: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["channel": channel, "ts": ts, "text": message.slackFormatEscaping(), "parse": parse.rawValue, "link_names": linkNames, "attachments":encodeAttachments(attachments)]
public func updateMessage(_ channel: String, ts: String, message: String, attachments: [Attachment?]? = nil, parse:ParseMode = .None, linkNames: Bool = false, success: ((_ updated: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["channel": channel as Optional<AnyObject>, "ts": ts as Optional<AnyObject>, "text": message.slackFormatEscaping() as Optional<AnyObject>, "parse": parse.rawValue as Optional<AnyObject>, "link_names": linkNames as Optional<AnyObject>, "attachments":encodeAttachments(attachments) as Optional<AnyObject>]
networkInterface.request(.ChatUpdate, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(updated: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Do Not Disturb
public func dndInfo(_ user: String? = nil, success: ((status: DoNotDisturbStatus)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["user": user]
public func dndInfo(_ user: String? = nil, success: ((_ status: DoNotDisturbStatus)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["user": user as Optional<AnyObject>]
networkInterface.request(.DNDInfo, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(status: DoNotDisturbStatus(status: response))
success?(DoNotDisturbStatus(status: response))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func dndTeamInfo(_ users: [String]? = nil, success: ((statuses: [String: DoNotDisturbStatus])->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["users":users?.joined(separator: ",")]
public func dndTeamInfo(_ users: [String]? = nil, success: ((_ statuses: [String: DoNotDisturbStatus])->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["users":users?.joined(separator: ",") as Optional<AnyObject>]
networkInterface.request(.DNDTeamInfo, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
guard let usersDictionary = response["users"] as? [String: AnyObject] else {
success?(statuses: [:])
success?([:])
return
}
success?(statuses: self.enumerateDNDStatuses(usersDictionary))
success?(self.enumerateDNDStatuses(usersDictionary))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Emoji
public func emojiList(_ success: ((emojiList: [String: AnyObject]?)->Void)?, failure: FailureClosure?) {
public func emojiList(_ success: ((_ emojiList: [String: AnyObject]?)->Void)?, failure: FailureClosure?) {
networkInterface.request(.EmojiList, token: token, parameters: nil, successClosure: {
(response) -> Void in
success?(emojiList: response["emoji"] as? [String: AnyObject])
success?(response["emoji"] as? [String: AnyObject])
}) { (error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Files
public func deleteFile(_ fileID: String, success: ((deleted: Bool)->Void)?, failure: FailureClosure?) {
public func deleteFile(_ fileID: String, success: ((_ deleted: Bool)->Void)?, failure: FailureClosure?) {
let parameters = ["file":fileID]
networkInterface.request(.FilesDelete, token: token, parameters: parameters, successClosure: {
networkInterface.request(.FilesDelete, token: token, parameters: parameters as [String : AnyObject]?, successClosure: {
(response) -> Void in
success?(deleted: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func fileInfo(_ fileID: String, commentCount: Int = 100, totalPages: Int = 1, success: ((file: File)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID, "count": commentCount, "totalPages":totalPages]
public func fileInfo(_ fileID: String, commentCount: Int = 100, totalPages: Int = 1, success: ((_ file: File)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID as AnyObject, "count": commentCount as AnyObject, "totalPages":totalPages as AnyObject]
networkInterface.request(.FilesInfo, token: token, parameters: parameters, successClosure: {
(response) in
var file = File(file: response["file"] as? [String: AnyObject])
@@ -297,438 +297,438 @@ public final class WebAPI {
file.comments[id] = comment
}
}
success?(file: file)
success?(file)
}) {(error) in
failure?(error: error)
failure?(error)
}
}
public func uploadFile(_ file: Data, filename: String, filetype: String = "auto", title: String? = nil, initialComment: String? = nil, channels: [String]? = nil, success: ((file: File)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["file":file, "filename": filename, "filetype":filetype, "title":title, "initial_comment":initialComment, "channels":channels?.joined(separator: ",")]
public func uploadFile(_ file: Data, filename: String, filetype: String = "auto", title: String? = nil, initialComment: String? = nil, channels: [String]? = nil, success: ((_ file: File)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["file":file as Optional<AnyObject>, "filename": filename as Optional<AnyObject>, "filetype":filetype as Optional<AnyObject>, "title":title as Optional<AnyObject>, "initial_comment":initialComment as Optional<AnyObject>, "channels":channels?.joined(separator: ",") as Optional<AnyObject>]
networkInterface.uploadRequest(token, data: file, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(file: File(file: response["file"] as? [String: AnyObject]))
success?(File(file: response["file"] as? [String: AnyObject]))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - File Comments
public func addFileComment(_ fileID: String, comment: String, success: ((comment: Comment)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID, "comment":comment.slackFormatEscaping()]
public func addFileComment(_ fileID: String, comment: String, success: ((_ comment: Comment)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID as AnyObject, "comment":comment.slackFormatEscaping() as AnyObject]
networkInterface.request(.FilesCommentsAdd, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(comment: Comment(comment: response["comment"] as? [String: AnyObject]))
success?(Comment(comment: response["comment"] as? [String: AnyObject]))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func editFileComment(_ fileID: String, commentID: String, comment: String, success: ((comment: Comment)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID, "id":commentID, "comment":comment.slackFormatEscaping()]
public func editFileComment(_ fileID: String, commentID: String, comment: String, success: ((_ comment: Comment)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID as AnyObject, "id":commentID as AnyObject, "comment":comment.slackFormatEscaping() as AnyObject]
networkInterface.request(.FilesCommentsEdit, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(comment: Comment(comment: response["comment"] as? [String: AnyObject]))
success?(Comment(comment: response["comment"] as? [String: AnyObject]))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func deleteFileComment(_ fileID: String, commentID: String, success: ((deleted: Bool?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID, "id": commentID]
public func deleteFileComment(_ fileID: String, commentID: String, success: ((_ deleted: Bool?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["file":fileID as AnyObject, "id": commentID as AnyObject]
networkInterface.request(.FilesCommentsDelete, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(deleted: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Groups
public func closeGroup(_ groupID: String, success: ((closed: Bool)->Void)?, failure: FailureClosure?) {
public func closeGroup(_ groupID: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
close(.GroupsClose, channelID: groupID, success: {
(closed) -> Void in
success?(closed:closed)
success?(closed)
}) {(error) -> Void in
failure?(error:error)
failure?(error)
}
}
public func groupHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((history: History)->Void)?, failure: FailureClosure?) {
public func groupHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((_ history: History)->Void)?, failure: FailureClosure?) {
history(.GroupsHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
(history) -> Void in
success?(history: history)
success?(history)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func groupInfo(_ id: String, success: ((channel: Channel)->Void)?, failure: FailureClosure?) {
public func groupInfo(_ id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
info(.GroupsInfo, type:ChannelType.Group, id: id, success: {
(channel) -> Void in
success?(channel: channel)
success?(channel)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func groupsList(_ excludeArchived: Bool = false, success: ((channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
public func groupsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
list(.GroupsList, type:ChannelType.Group, excludeArchived: excludeArchived, success: {
(channels) -> Void in
success?(channels: channels)
success?(channels)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func markGroup(_ channel: String, timestamp: String, success: ((ts: String)->Void)?, failure: FailureClosure?) {
public func markGroup(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
mark(.GroupsMark, channel: channel, timestamp: timestamp, success: {
(ts) -> Void in
success?(ts: timestamp)
success?(timestamp)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func openGroup(_ channel: String, success: ((opened: Bool)->Void)?, failure: FailureClosure?) {
public func openGroup(_ channel: String, success: ((_ opened: Bool)->Void)?, failure: FailureClosure?) {
let parameters = ["channel":channel]
networkInterface.request(.GroupsOpen, token: token, parameters: parameters, successClosure: {
networkInterface.request(.GroupsOpen, token: token, parameters: parameters as [String : AnyObject]?, successClosure: {
(response) -> Void in
success?(opened: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func setGroupPurpose(_ channel: String, purpose: String, success: ((purposeSet: Bool)->Void)?, failure: FailureClosure?) {
public func setGroupPurpose(_ channel: String, purpose: String, success: ((_ purposeSet: Bool)->Void)?, failure: FailureClosure?) {
setInfo(.GroupsSetPurpose, type: .Purpose, channel: channel, text: purpose, success: {
(purposeSet) -> Void in
success?(purposeSet: purposeSet)
success?(purposeSet)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func setGroupTopic(_ channel: String, topic: String, success: ((topicSet: Bool)->Void)?, failure: FailureClosure?) {
public func setGroupTopic(_ channel: String, topic: String, success: ((_ topicSet: Bool)->Void)?, failure: FailureClosure?) {
setInfo(.GroupsSetTopic, type: .Topic, channel: channel, text: topic, success: {
(topicSet) -> Void in
success?(topicSet: topicSet)
success?(topicSet)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - IM
public func closeIM(_ channel: String, success: ((closed: Bool)->Void)?, failure: FailureClosure?) {
public func closeIM(_ channel: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
close(.IMClose, channelID: channel, success: {
(closed) -> Void in
success?(closed: closed)
success?(closed)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func imHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((history: History)->Void)?, failure: FailureClosure?) {
public func imHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((_ history: History)->Void)?, failure: FailureClosure?) {
history(.IMHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
(history) -> Void in
success?(history: history)
success?(history)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func imsList(_ excludeArchived: Bool = false, success: ((channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
public func imsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
list(.IMList, type:ChannelType.IM, excludeArchived: excludeArchived, success: {
(channels) -> Void in
success?(channels: channels)
success?(channels)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func markIM(_ channel: String, timestamp: String, success: ((ts: String)->Void)?, failure: FailureClosure?) {
public func markIM(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
mark(.IMMark, channel: channel, timestamp: timestamp, success: {
(ts) -> Void in
success?(ts: timestamp)
success?(timestamp)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func openIM(_ userID: String, success: ((imID: String?)->Void)?, failure: FailureClosure?) {
public func openIM(_ userID: String, success: ((_ imID: String?)->Void)?, failure: FailureClosure?) {
let parameters = ["user":userID]
networkInterface.request(.IMOpen, token: token, parameters: parameters, successClosure: {
networkInterface.request(.IMOpen, token: token, parameters: parameters as [String : AnyObject]?, successClosure: {
(response) -> Void in
let group = response["channel"] as? [String: AnyObject]
success?(imID: group?["id"] as? String)
success?(group?["id"] as? String)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - MPIM
public func closeMPIM(_ channel: String, success: ((closed: Bool)->Void)?, failure: FailureClosure?) {
public func closeMPIM(_ channel: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
close(.MPIMClose, channelID: channel, success: {
(closed) -> Void in
success?(closed: closed)
success?(closed)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func mpimHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((history: History)->Void)?, failure: FailureClosure?) {
public func mpimHistory(_ id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((_ history: History)->Void)?, failure: FailureClosure?) {
history(.MPIMHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
(history) -> Void in
success?(history: history)
success?(history)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func mpimsList(_ excludeArchived: Bool = false, success: ((channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
public func mpimsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
list(.MPIMList, type:ChannelType.Group, excludeArchived: excludeArchived, success: {
(channels) -> Void in
success?(channels: channels)
success?(channels)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func markMPIM(_ channel: String, timestamp: String, success: ((ts: String)->Void)?, failure: FailureClosure?) {
public func markMPIM(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
mark(.MPIMMark, channel: channel, timestamp: timestamp, success: {
(ts) -> Void in
success?(ts: timestamp)
success?(timestamp)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func openMPIM(_ userIDs: [String], success: ((mpimID: String?)->Void)?, failure: FailureClosure?) {
public func openMPIM(_ userIDs: [String], success: ((_ mpimID: String?)->Void)?, failure: FailureClosure?) {
let parameters = ["users":userIDs.joined(separator: ",")]
networkInterface.request(.MPIMOpen, token: token, parameters: parameters, successClosure: {
networkInterface.request(.MPIMOpen, token: token, parameters: parameters as [String : AnyObject]?, successClosure: {
(response) -> Void in
let group = response["group"] as? [String: AnyObject]
success?(mpimID: group?["id"] as? String)
success?(group?["id"] as? String)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Pins
public func pinItem(_ channel: String, file: String? = nil, fileComment: String? = nil, timestamp: String? = nil, success: ((pinned: Bool)->Void)?, failure: FailureClosure?) {
public func pinItem(_ channel: String, file: String? = nil, fileComment: String? = nil, timestamp: String? = nil, success: ((_ pinned: Bool)->Void)?, failure: FailureClosure?) {
pin(.PinsAdd, channel: channel, file: file, fileComment: fileComment, timestamp: timestamp, success: {
(ok) -> Void in
success?(pinned: ok)
success?(ok)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func unpinItem(_ channel: String, file: String? = nil, fileComment: String? = nil, timestamp: String? = nil, success: ((unpinned: Bool)->Void)?, failure: FailureClosure?) {
public func unpinItem(_ channel: String, file: String? = nil, fileComment: String? = nil, timestamp: String? = nil, success: ((_ unpinned: Bool)->Void)?, failure: FailureClosure?) {
pin(.PinsRemove, channel: channel, file: file, fileComment: fileComment, timestamp: timestamp, success: {
(ok) -> Void in
success?(unpinned: ok)
success?(ok)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func pin(_ endpoint: Endpoint, channel: String, file: String? = nil, fileComment: String? = nil, timestamp: String? = nil, success: ((ok: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["channel":channel, "file":file, "file_comment":fileComment, "timestamp":timestamp]
fileprivate func pin(_ endpoint: Endpoint, channel: String, file: String? = nil, fileComment: String? = nil, timestamp: String? = nil, success: ((_ ok: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["channel":channel as Optional<AnyObject>, "file":file as Optional<AnyObject>, "file_comment":fileComment as Optional<AnyObject>, "timestamp":timestamp as Optional<AnyObject>]
networkInterface.request(endpoint, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(ok: true)
success?(true)
}){(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Reactions
// One of file, file_comment, or the combination of channel and timestamp must be specified.
public func addReaction(_ name: String, file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((reacted: Bool)->Void)?, failure: FailureClosure?) {
public func addReaction(_ name: String, file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((_ reacted: Bool)->Void)?, failure: FailureClosure?) {
react(.ReactionsAdd, name: name, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
(ok) -> Void in
success?(reacted: ok)
success?(ok)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
// One of file, file_comment, or the combination of channel and timestamp must be specified.
public func removeReaction(_ name: String, file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((unreacted: Bool)->Void)?, failure: FailureClosure?) {
public func removeReaction(_ name: String, file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((_ unreacted: Bool)->Void)?, failure: FailureClosure?) {
react(.ReactionsRemove, name: name, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
(ok) -> Void in
success?(unreacted: ok)
success?(ok)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func react(_ endpoint: Endpoint, name: String, file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((ok: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["name":name, "file":file, "file_comment":fileComment, "channel":channel, "timestamp":timestamp]
fileprivate func react(_ endpoint: Endpoint, name: String, file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((_ ok: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["name":name as Optional<AnyObject>, "file":file as Optional<AnyObject>, "file_comment":fileComment as Optional<AnyObject>, "channel":channel as Optional<AnyObject>, "timestamp":timestamp as Optional<AnyObject>]
networkInterface.request(endpoint, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(ok: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Stars
// One of file, file_comment, channel, or the combination of channel and timestamp must be specified.
public func addStar(_ file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((starred: Bool)->Void)?, failure: FailureClosure?) {
public func addStar(_ file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((_ starred: Bool)->Void)?, failure: FailureClosure?) {
star(.StarsAdd, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
(ok) -> Void in
success?(starred: ok)
success?(ok)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
// One of file, file_comment, channel, or the combination of channel and timestamp must be specified.
public func removeStar(_ file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((unstarred: Bool)->Void)?, failure: FailureClosure?) {
public func removeStar(_ file: String? = nil, fileComment: String? = nil, channel: String? = nil, timestamp: String? = nil, success: ((_ unstarred: Bool)->Void)?, failure: FailureClosure?) {
star(.StarsRemove, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
(ok) -> Void in
success?(unstarred: ok)
success?(ok)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func star(_ endpoint: Endpoint, file: String?, fileComment: String?, channel: String?, timestamp: String?, success: ((ok: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["file":file, "file_comment":fileComment, "channel":channel, "timestamp":timestamp]
fileprivate func star(_ endpoint: Endpoint, file: String?, fileComment: String?, channel: String?, timestamp: String?, success: ((_ ok: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject?] = ["file":file as Optional<AnyObject>, "file_comment":fileComment as Optional<AnyObject>, "channel":channel as Optional<AnyObject>, "timestamp":timestamp as Optional<AnyObject>]
networkInterface.request(endpoint, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
(response) -> Void in
success?(ok: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Team
public func teamInfo(_ success: ((info: [String: AnyObject]?)->Void)?, failure: FailureClosure?) {
public func teamInfo(_ success: ((_ info: [String: AnyObject]?)->Void)?, failure: FailureClosure?) {
networkInterface.request(.TeamInfo, token: token, parameters: nil, successClosure: {
(response) -> Void in
success?(info: response["team"] as? [String: AnyObject])
success?(response["team"] as? [String: AnyObject])
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Users
public func userPresence(_ user: String, success: ((presence: String?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["user":user]
public func userPresence(_ user: String, success: ((_ presence: String?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["user":user as AnyObject]
networkInterface.request(.UsersGetPresence, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(presence: response["presence"] as? String)
success?(response["presence"] as? String)
}){(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func userInfo(_ id: String, success: ((user: User)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["user":id]
public func userInfo(_ id: String, success: ((_ user: User)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["user":id as AnyObject]
networkInterface.request(.UsersInfo, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(user: User(user: response["user"] as? [String: AnyObject]))
success?(User(user: response["user"] as? [String: AnyObject]))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func usersList(_ includePresence: Bool = false, success: ((userList: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["presence":includePresence]
public func usersList(_ includePresence: Bool = false, success: ((_ userList: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["presence":includePresence as AnyObject]
networkInterface.request(.UsersList, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(userList: response["members"] as? [[String: AnyObject]])
success?(response["members"] as? [[String: AnyObject]])
}){(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func setUserActive(_ success: ((success: Bool)->Void)?, failure: FailureClosure?) {
public func setUserActive(_ success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
networkInterface.request(.UsersSetActive, token: token, parameters: nil, successClosure: {
(response) -> Void in
success?(success: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
public func setUserPresence(_ presence: Presence, success: ((success: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["presence":presence.rawValue]
public func setUserPresence(_ presence: Presence, success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["presence":presence.rawValue as AnyObject]
networkInterface.request(.UsersSetPresence, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(success:true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Channel Utilities
private func close(_ endpoint: Endpoint, channelID: String, success: ((closed: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel":channelID]
fileprivate func close(_ endpoint: Endpoint, channelID: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel":channelID as AnyObject]
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(closed: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func history(_ endpoint: Endpoint, id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((history: History)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": id, "latest": latest, "oldest": oldest, "inclusive":inclusive, "count":count, "unreads":unreads]
fileprivate func history(_ endpoint: Endpoint, id: String, latest: String = "\(Date().timeIntervalSince1970)", oldest: String = "0", inclusive: Bool = false, count: Int = 100, unreads: Bool = false, success: ((_ history: History)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": id as AnyObject, "latest": latest as AnyObject, "oldest": oldest as AnyObject, "inclusive":inclusive as AnyObject, "count":count as AnyObject, "unreads":unreads as AnyObject]
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(history: History(history: response))
success?(History(history: response))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func info(_ endpoint: Endpoint, type: ChannelType, id: String, success: ((channel: Channel)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": id]
fileprivate func info(_ endpoint: Endpoint, type: ChannelType, id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": id as AnyObject]
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(channel: Channel(channel: response[type.rawValue] as? [String: AnyObject]))
success?(Channel(channel: response[type.rawValue] as? [String: AnyObject]))
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func list(_ endpoint: Endpoint, type: ChannelType, excludeArchived: Bool = false, success: ((channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["exclude_archived": excludeArchived]
fileprivate func list(_ endpoint: Endpoint, type: ChannelType, excludeArchived: Bool = false, success: ((_ channels: [[String: AnyObject]]?)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["exclude_archived": excludeArchived as AnyObject]
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(channels: response[type.rawValue+"s"] as? [[String: AnyObject]])
success?(response[type.rawValue+"s"] as? [[String: AnyObject]])
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func mark(_ endpoint: Endpoint, channel: String, timestamp: String, success: ((ts: String)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": channel, "ts": timestamp]
fileprivate func mark(_ endpoint: Endpoint, channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": channel as AnyObject, "ts": timestamp as AnyObject]
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(ts: timestamp)
success?(timestamp)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
private func setInfo(_ endpoint: Endpoint, type: InfoType, channel: String, text: String, success: ((success: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": channel, type.rawValue: text]
fileprivate func setInfo(_ endpoint: Endpoint, type: InfoType, channel: String, text: String, success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
let parameters: [String: AnyObject] = ["channel": channel as AnyObject, type.rawValue: text as AnyObject]
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
(response) -> Void in
success?(success: true)
success?(true)
}) {(error) -> Void in
failure?(error: error)
failure?(error)
}
}
//MARK: - Encode Attachments
private func encodeAttachments(_ attachments: [Attachment?]?) -> String? {
fileprivate func encodeAttachments(_ attachments: [Attachment?]?) -> String? {
if let attachments = attachments {
var attachmentArray: [[String: AnyObject]] = []
for attachment in attachments {
@@ -758,7 +758,7 @@ public final class WebAPI {
}
//MARK: - Enumerate Do Not Disturb Status
private func enumerateDNDStatuses(_ statuses: [String: AnyObject]) -> [String: DoNotDisturbStatus] {
fileprivate func enumerateDNDStatuses(_ statuses: [String: AnyObject]) -> [String: DoNotDisturbStatus] {
var retVal = [String: DoNotDisturbStatus]()
for key in statuses.keys {
retVal[key] = DoNotDisturbStatus(status: statuses[key] as? [String: AnyObject])
+3 -3
View File
@@ -21,14 +21,14 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
public class WebhookServer: Server {
open class WebhookServer: Server {
public init(token: String, route: String, response: Response) {
super.init(token: token)
addRoute(route, response: response)
}
public func addRoute(_ route: String, response: Response) {
open func addRoute(_ route: String, response: Response) {
http["/\(route)"] = { request in
let webhookRequest = WebhookRequest(request: self.dictionaryFromRequest(request.body))
if webhookRequest.token == self.token {
@@ -39,7 +39,7 @@ public class WebhookServer: Server {
}
}
private func replyForResponse(_ response: Response) -> Reply {
fileprivate func replyForResponse(_ response: Response) -> Reply {
if response.attachments == nil && response.responseType == nil {
return Reply.text(body: response.text)
} else {