Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| aa51cfb2fd | |||
| 6b8885bd29 | |||
| e0fbf1ab4e | |||
| 366c6e7b77 | |||
| 378c116d9b | |||
| 58bade8ec9 | |||
| 7d7f5c40d6 | |||
| c9fd54d106 | |||
| 2f1ce799ad | |||
| 7f02f4cf99 | |||
| a9066c0d0a | |||
| 29739dba74 | |||
| d60a7094a4 | |||
| 7edd4210f6 | |||
| 2abaecbd14 | |||
| 346499e03b | |||
| bc72a52bf5 | |||
| 0ebd3cb0e7 | |||
| 5d7064ee13 | |||
| d02768ddad | |||
| dbc7b361c8 | |||
| a0de46e3c7 | |||
| 2d6e19baee | |||
| 21ec3cb2a1 | |||
| cb542da068 | |||
| 788b4e4f7a | |||
| 24b2292cba | |||
| 72866262d2 | |||
| acabbb6c03 | |||
| fff0f0befc | |||
| cf0675dac2 | |||
| 1cffa0ba74 | |||
| 9ebd8182a6 | |||
| 63a8ae7f08 | |||
| 992f94e870 | |||
| 1c476c77ad |
@@ -1,2 +1,2 @@
|
||||
git "https://github.com/daltoniam/Starscream" == 2.0.0
|
||||
git "https://github.com/pvzig/swifter.git" == 3.0.4
|
||||
github "https://github.com/daltoniam/Starscream" == 2.0.2
|
||||
github "https://github.com/pvzig/swifter.git" == 3.0.4
|
||||
+2
-2
@@ -1,2 +1,2 @@
|
||||
git "https://github.com/daltoniam/Starscream" "2.0.0"
|
||||
git "https://github.com/pvzig/swifter.git" "3.0.4"
|
||||
github "daltoniam/Starscream" "2.0.2"
|
||||
github "pvzig/swifter" "3.0.4"
|
||||
|
||||
@@ -3,16 +3,16 @@ source 'https://github.com/CocoaPods/Specs.git'
|
||||
use_frameworks!
|
||||
|
||||
target 'SlackKit OS X' do
|
||||
pod 'Starscream', '~> 2.0.0'
|
||||
pod 'Swifter', '~> 1.3.2'
|
||||
pod 'Starscream', '~> 2.0.2'
|
||||
pod 'Swifter', :git => 'https://github.com/pvzig/swifter.git', :tag => '3.0.4'
|
||||
end
|
||||
|
||||
target 'SlackKit iOS' do
|
||||
pod 'Starscream', '~> 2.0.0'
|
||||
pod 'Swifter', '~> 1.3.2'
|
||||
pod 'Starscream', '~> 2.0.2'
|
||||
pod 'Swifter', :git => 'https://github.com/pvzig/swifter.git', :tag => '3.0.4'
|
||||
end
|
||||
|
||||
target 'SlackKit tvOS' do
|
||||
pod 'Starscream', '~> 2.0.0'
|
||||
pod 'Swifter', '~> 1.3.2'
|
||||
pod 'Starscream', '~> 2.0.2'
|
||||
pod 'Swifter', :git => 'https://github.com/pvzig/swifter.git', :tag => '3.0.4'
|
||||
end
|
||||
+15
-5
@@ -1,15 +1,25 @@
|
||||
PODS:
|
||||
- Starscream (2.0.0)
|
||||
- Starscream (2.0.2)
|
||||
- Swifter (1.3.2)
|
||||
|
||||
DEPENDENCIES:
|
||||
- Starscream (~> 2.0.0)
|
||||
- Swifter (~> 1.3.2)
|
||||
- Starscream (~> 2.0.2)
|
||||
- Swifter (from `https://github.com/pvzig/swifter.git`, tag `3.0.4`)
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
Swifter:
|
||||
:git: https://github.com/pvzig/swifter.git
|
||||
:tag: 3.0.4
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
Swifter:
|
||||
:git: https://github.com/pvzig/swifter.git
|
||||
:tag: 3.0.4
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Starscream: 947c865596f0d6bb3f0203fee23228ed2d471468
|
||||
Starscream: 6c135a34e0a6e60cedaa0b30db67a4c05cf7cd38
|
||||
Swifter: dd1800ba8eb3e28b22b8bd20f91a8561a0110fac
|
||||
|
||||
PODFILE CHECKSUM: 3d4e92bde92fd20d6fe672ad26f677fcbfafda1f
|
||||
PODFILE CHECKSUM: cd86ea0f8422027c9d5fa3c40243ae7a816fb79a
|
||||
|
||||
COCOAPODS: 1.1.0.rc.3
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||

|
||||
|
||||
   [](https://github.com/apple/swift-package-manager) [](https://github.com/Carthage/Carthage)
|
||||
   [](https://cocoapods.org) [](https://github.com/Carthage/Carthage) [](https://github.com/apple/swift-package-manager)
|
||||
## SlackKit: A Swift Slack Client Library
|
||||
### Description
|
||||
|
||||
@@ -18,11 +18,11 @@ To build the SlackKit project directly, first build the dependencies using Carth
|
||||
Add SlackKit to your pod file:
|
||||
```
|
||||
use_frameworks!
|
||||
pod 'SlackKit', '~> 3.1.2'
|
||||
pod 'SlackKit', '~> 3.1.7'
|
||||
```
|
||||
and run
|
||||
```
|
||||
# Use CocoaPods version >= 1.1.0.rc.2 (gem install cocoapods --pre)
|
||||
# Use CocoaPods version >= 1.1.0
|
||||
pod install
|
||||
```
|
||||
|
||||
@@ -36,10 +36,6 @@ and run
|
||||
```
|
||||
carthage bootstrap
|
||||
```
|
||||
**Note:** SlackKit currently takes a _long_ time for the compiler to compile with optimizations turned on. I'm currently exploring a potential fix for this issue. In the meantime, you may want to skip the waiting and build it in the debug configuration instead:
|
||||
```
|
||||
carthage bootstrap --configuration "Debug"
|
||||
```
|
||||
|
||||
Drag the built `SlackKit.framework` into your Xcode project.
|
||||
|
||||
@@ -88,7 +84,7 @@ incoming.postMessage(message)
|
||||
#### Slash Commands
|
||||
After [configuring your slash command in Slack](https://my.slack.com/services/new/slash-commands) (you can also provide slash commands as part of a [Slack App](https://api.slack.com/slack-apps)), initialize a webhook server with the token for the slash command, a configured route, and a response.
|
||||
```swift
|
||||
let response = Response(text: "Hello, World!", responseType: .InChannel)
|
||||
let response = Response(text: "Hello, World!", responseType: .inChannel)
|
||||
let webhook = WebhookServer(token: "SLASH-COMMAND-TOKEN", route: "hello_world", response: response)
|
||||
webhook.start()
|
||||
```
|
||||
@@ -111,7 +107,7 @@ let attachment = Attachment(fallback: "Hello World Attachment", title: "Attachme
|
||||
To act on message actions, initialize an instance of the `MessageActionServer` using your app’s verification token, your specified interactive messages request URL route, and a `MessageActionResponder`:
|
||||
```swift
|
||||
let action = Action(name: "hello_world", text: "Hello, World!")
|
||||
let response = Response(text: "Hello, 🌎!", responseType: .InChannel)
|
||||
let response = Response(text: "Hello, 🌎!", responseType: .inChannel)
|
||||
let responder = MessageActionResponder(responses: [(action, response)])
|
||||
let server = MessageActionServer(token: "SLACK-APP-VERIFICATION-TOKEN", route: "actions", responder: responder)
|
||||
server.start()
|
||||
@@ -152,6 +148,7 @@ SlackKit currently supports the a subset of the Slack Web APIs that are availabl
|
||||
- channels.setPurpose
|
||||
- channels.setTopic
|
||||
- chat.delete
|
||||
- chat.meMessage
|
||||
- chat.postMessage
|
||||
- chat.update
|
||||
- emoji.list
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SlackKit"
|
||||
s.version = "3.1.2"
|
||||
s.version = "3.1.8"
|
||||
s.summary = "a Slack client library for OS X, iOS, and tvOS written in Swift"
|
||||
s.homepage = "https://github.com/pvzig/SlackKit"
|
||||
s.license = 'MIT'
|
||||
|
||||
+396
-389
@@ -7,211 +7,211 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
2601D61B1C7646B80012BF22 /* SlackError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2601D61A1C7646B80012BF22 /* SlackError.swift */; };
|
||||
260EC2331C4DC61D0093B253 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2301C4DC61D0093B253 /* Extensions.swift */; };
|
||||
260EC2341C4DC61D0093B253 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2311C4DC61D0093B253 /* NetworkInterface.swift */; };
|
||||
260EC2351C4DC61D0093B253 /* WebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2321C4DC61D0093B253 /* WebAPI.swift */; };
|
||||
263993901CE90C87004A6E93 /* SlackKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 2661A6A41BBF62FF0026F67B /* SlackKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
263993971CE90EE0004A6E93 /* Client+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16C98791CE7D3DD00692776 /* Client+Utilities.swift */; };
|
||||
263993981CE90EE0004A6E93 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1881C398E3C00BF7225 /* Channel.swift */; };
|
||||
263993991CE90EE0004A6E93 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1921C398E3C00BF7225 /* User.swift */; };
|
||||
2639939B1CE90EE0004A6E93 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1891C398E3C00BF7225 /* Client.swift */; };
|
||||
2639939C1CE90EE0004A6E93 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18A1C398E3C00BF7225 /* Event.swift */; };
|
||||
2639939D1CE90EE0004A6E93 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1871C398E3C00BF7225 /* Bot.swift */; };
|
||||
2639939E1CE90EE0004A6E93 /* Client+EventDispatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A85FF71CE3BCEF00756C40 /* Client+EventDispatching.swift */; };
|
||||
2639939F1CE90EE0004A6E93 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18E1C398E3C00BF7225 /* File.swift */; };
|
||||
263993A01CE90EE0004A6E93 /* WebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2321C4DC61D0093B253 /* WebAPI.swift */; };
|
||||
263993A11CE90EE0004A6E93 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DF40341C7A0FA300E19241 /* Attachment.swift */; };
|
||||
263993A21CE90EE0004A6E93 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18F1C398E3C00BF7225 /* Message.swift */; };
|
||||
263993A31CE90EE0004A6E93 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1901C398E3C00BF7225 /* Team.swift */; };
|
||||
263993A41CE90EE0004A6E93 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2301C4DC61D0093B253 /* Extensions.swift */; };
|
||||
263993A51CE90EE0004A6E93 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1931C398E3C00BF7225 /* UserGroup.swift */; };
|
||||
263993A61CE90EE0004A6E93 /* SlackError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2601D61A1C7646B80012BF22 /* SlackError.swift */; };
|
||||
263993A71CE90EE0004A6E93 /* Client+EventHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A85FF81CE3BCEF00756C40 /* Client+EventHandling.swift */; };
|
||||
263993A81CE90EE0004A6E93 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2311C4DC61D0093B253 /* NetworkInterface.swift */; };
|
||||
263993A91CE90EE0004A6E93 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18B1C398E3C00BF7225 /* EventDelegate.swift */; };
|
||||
263993AD1CE90EE0004A6E93 /* SlackKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 2661A6A41BBF62FF0026F67B /* SlackKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
263993B61CE90EED004A6E93 /* Client+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16C98791CE7D3DD00692776 /* Client+Utilities.swift */; };
|
||||
263993B71CE90EED004A6E93 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1881C398E3C00BF7225 /* Channel.swift */; };
|
||||
263993B81CE90EED004A6E93 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1921C398E3C00BF7225 /* User.swift */; };
|
||||
263993BA1CE90EED004A6E93 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1891C398E3C00BF7225 /* Client.swift */; };
|
||||
263993BB1CE90EED004A6E93 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18A1C398E3C00BF7225 /* Event.swift */; };
|
||||
263993BC1CE90EED004A6E93 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1871C398E3C00BF7225 /* Bot.swift */; };
|
||||
263993BD1CE90EED004A6E93 /* Client+EventDispatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A85FF71CE3BCEF00756C40 /* Client+EventDispatching.swift */; };
|
||||
263993BE1CE90EED004A6E93 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18E1C398E3C00BF7225 /* File.swift */; };
|
||||
263993BF1CE90EED004A6E93 /* WebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2321C4DC61D0093B253 /* WebAPI.swift */; };
|
||||
263993C01CE90EED004A6E93 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DF40341C7A0FA300E19241 /* Attachment.swift */; };
|
||||
263993C11CE90EED004A6E93 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18F1C398E3C00BF7225 /* Message.swift */; };
|
||||
263993C21CE90EED004A6E93 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1901C398E3C00BF7225 /* Team.swift */; };
|
||||
263993C31CE90EED004A6E93 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2301C4DC61D0093B253 /* Extensions.swift */; };
|
||||
263993C41CE90EED004A6E93 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1931C398E3C00BF7225 /* UserGroup.swift */; };
|
||||
263993C51CE90EED004A6E93 /* SlackError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2601D61A1C7646B80012BF22 /* SlackError.swift */; };
|
||||
263993C61CE90EED004A6E93 /* Client+EventHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A85FF81CE3BCEF00756C40 /* Client+EventHandling.swift */; };
|
||||
263993C71CE90EED004A6E93 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260EC2311C4DC61D0093B253 /* NetworkInterface.swift */; };
|
||||
263993C81CE90EED004A6E93 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18B1C398E3C00BF7225 /* EventDelegate.swift */; };
|
||||
263993CC1CE90EED004A6E93 /* SlackKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 2661A6A41BBF62FF0026F67B /* SlackKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
2659FC1B1DADC4E0003F3930 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4307A07F1CC6D0910011D5DE /* Starscream.framework */; };
|
||||
2659FC1C1DADC4E0003F3930 /* Swifter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26B30B6B1D289FA0004D4AB5 /* Swifter.framework */; };
|
||||
2659FC1D1DADC4F2003F3930 /* Swifter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26B30B6E1D289FB2004D4AB5 /* Swifter.framework */; };
|
||||
2659FC1F1DADC4F2003F3930 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2659FC1E1DADC4F2003F3930 /* Starscream.framework */; };
|
||||
2659FC201DADC4FC003F3930 /* Swifter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 269B47CB1D3AE5670042D137 /* Swifter.framework */; };
|
||||
2659FC221DADC4FC003F3930 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2659FC211DADC4FC003F3930 /* Starscream.framework */; };
|
||||
2678B5941D3151B900CE521A /* AuthorizeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2678B5931D3151B900CE521A /* AuthorizeResponse.swift */; };
|
||||
2678B5951D3151B900CE521A /* AuthorizeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2678B5931D3151B900CE521A /* AuthorizeResponse.swift */; };
|
||||
2678B5961D3151B900CE521A /* AuthorizeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2678B5931D3151B900CE521A /* AuthorizeResponse.swift */; };
|
||||
2678B5971D3151C600CE521A /* MessageActionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B871D297A98004D4AB5 /* MessageActionRequest.swift */; };
|
||||
2678B5981D3151C900CE521A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B931D298E78004D4AB5 /* Response.swift */; };
|
||||
2678B5991D3151CD00CE521A /* WebhookRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B981D298F25004D4AB5 /* WebhookRequest.swift */; };
|
||||
269B475A1D3493DE0042D137 /* OAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47591D3493DE0042D137 /* OAuthResponse.swift */; };
|
||||
269B475B1D3493DE0042D137 /* OAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47591D3493DE0042D137 /* OAuthResponse.swift */; };
|
||||
269B475C1D3493DE0042D137 /* OAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47591D3493DE0042D137 /* OAuthResponse.swift */; };
|
||||
269B475E1D3538E90042D137 /* SlackKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B475D1D3538E90042D137 /* SlackKit.swift */; };
|
||||
269B475F1D3538E90042D137 /* SlackKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B475D1D3538E90042D137 /* SlackKit.swift */; };
|
||||
269B47601D3538E90042D137 /* SlackKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B475D1D3538E90042D137 /* SlackKit.swift */; };
|
||||
269B47621D3544240042D137 /* IncomingWebhook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47611D3544240042D137 /* IncomingWebhook.swift */; };
|
||||
269B47631D3544240042D137 /* IncomingWebhook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47611D3544240042D137 /* IncomingWebhook.swift */; };
|
||||
269B47641D3544240042D137 /* IncomingWebhook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47611D3544240042D137 /* IncomingWebhook.swift */; };
|
||||
269B47661D39AAA80042D137 /* MessageActionResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47651D39AAA80042D137 /* MessageActionResponder.swift */; };
|
||||
269B47671D39AAA80042D137 /* MessageActionResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47651D39AAA80042D137 /* MessageActionResponder.swift */; };
|
||||
269B47681D39AAA80042D137 /* MessageActionResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47651D39AAA80042D137 /* MessageActionResponder.swift */; };
|
||||
269B47C71D3AE25B0042D137 /* MessageActionServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B8F1D298E08004D4AB5 /* MessageActionServer.swift */; };
|
||||
269B47C81D3AE25B0042D137 /* MessageActionServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B8F1D298E08004D4AB5 /* MessageActionServer.swift */; };
|
||||
269B47C91D3AE2620042D137 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B911D298E12004D4AB5 /* Server.swift */; };
|
||||
269B47CA1D3AE2670042D137 /* WebhookServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC15001D260B1000FD3A53 /* WebhookServer.swift */; };
|
||||
269B47CE1D3C22FC0042D137 /* ClientOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47CD1D3C22FC0042D137 /* ClientOptions.swift */; };
|
||||
269B47CF1D3C22FC0042D137 /* ClientOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47CD1D3C22FC0042D137 /* ClientOptions.swift */; };
|
||||
269B47D01D3C22FC0042D137 /* ClientOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269B47CD1D3C22FC0042D137 /* ClientOptions.swift */; };
|
||||
26B30B881D297A98004D4AB5 /* MessageActionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B871D297A98004D4AB5 /* MessageActionRequest.swift */; };
|
||||
26B30B901D298E08004D4AB5 /* MessageActionServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B8F1D298E08004D4AB5 /* MessageActionServer.swift */; };
|
||||
26B30B921D298E12004D4AB5 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B911D298E12004D4AB5 /* Server.swift */; };
|
||||
26B30B941D298E78004D4AB5 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B931D298E78004D4AB5 /* Response.swift */; };
|
||||
26B30B951D298E78004D4AB5 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B931D298E78004D4AB5 /* Response.swift */; };
|
||||
26B30B961D298EE1004D4AB5 /* MessageActionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B871D297A98004D4AB5 /* MessageActionRequest.swift */; };
|
||||
26B30B971D298EED004D4AB5 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B911D298E12004D4AB5 /* Server.swift */; };
|
||||
26B30B991D298F25004D4AB5 /* WebhookRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B981D298F25004D4AB5 /* WebhookRequest.swift */; };
|
||||
26B30B9A1D298F25004D4AB5 /* WebhookRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30B981D298F25004D4AB5 /* WebhookRequest.swift */; };
|
||||
26B30BB61D2BC2E4004D4AB5 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BB51D2BC2E4004D4AB5 /* Scope.swift */; };
|
||||
26B30BB71D2BC2E4004D4AB5 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BB51D2BC2E4004D4AB5 /* Scope.swift */; };
|
||||
26B30BB81D2BC2E4004D4AB5 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BB51D2BC2E4004D4AB5 /* Scope.swift */; };
|
||||
26B30BC31D2DFF0D004D4AB5 /* OAuthServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BC21D2DFF0D004D4AB5 /* OAuthServer.swift */; };
|
||||
26B30BC41D2DFF0D004D4AB5 /* OAuthServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BC21D2DFF0D004D4AB5 /* OAuthServer.swift */; };
|
||||
26B30BC51D2DFF0D004D4AB5 /* OAuthServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BC21D2DFF0D004D4AB5 /* OAuthServer.swift */; };
|
||||
26B30BC71D2DFF7D004D4AB5 /* AuthorizeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BC61D2DFF7D004D4AB5 /* AuthorizeRequest.swift */; };
|
||||
26B30BC81D2DFF7D004D4AB5 /* AuthorizeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BC61D2DFF7D004D4AB5 /* AuthorizeRequest.swift */; };
|
||||
26B30BC91D2DFF7D004D4AB5 /* AuthorizeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B30BC61D2DFF7D004D4AB5 /* AuthorizeRequest.swift */; };
|
||||
26BBA1941C398E3C00BF7225 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1871C398E3C00BF7225 /* Bot.swift */; };
|
||||
26BBA1951C398E3C00BF7225 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1881C398E3C00BF7225 /* Channel.swift */; };
|
||||
26BBA1961C398E3C00BF7225 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1891C398E3C00BF7225 /* Client.swift */; };
|
||||
26BBA1971C398E3C00BF7225 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18A1C398E3C00BF7225 /* Event.swift */; };
|
||||
26BBA1981C398E3C00BF7225 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18B1C398E3C00BF7225 /* EventDelegate.swift */; };
|
||||
26BBA19B1C398E3C00BF7225 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18E1C398E3C00BF7225 /* File.swift */; };
|
||||
26BBA19C1C398E3C00BF7225 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA18F1C398E3C00BF7225 /* Message.swift */; };
|
||||
26BBA19D1C398E3C00BF7225 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1901C398E3C00BF7225 /* Team.swift */; };
|
||||
26BBA19F1C398E3C00BF7225 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1921C398E3C00BF7225 /* User.swift */; };
|
||||
26BBA1A01C398E3C00BF7225 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26BBA1931C398E3C00BF7225 /* UserGroup.swift */; };
|
||||
26DF40351C7A0FA300E19241 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DF40341C7A0FA300E19241 /* Attachment.swift */; };
|
||||
26EC14C11D1EF16500FD3A53 /* AttachmentField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C01D1EF16500FD3A53 /* AttachmentField.swift */; };
|
||||
26EC14C21D1EF16500FD3A53 /* AttachmentField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C01D1EF16500FD3A53 /* AttachmentField.swift */; };
|
||||
26EC14C31D1EF16500FD3A53 /* AttachmentField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C01D1EF16500FD3A53 /* AttachmentField.swift */; };
|
||||
26EC14C91D1EF17400FD3A53 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C41D1EF17400FD3A53 /* Comment.swift */; };
|
||||
26EC14CA1D1EF17400FD3A53 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C41D1EF17400FD3A53 /* Comment.swift */; };
|
||||
26EC14CB1D1EF17400FD3A53 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C41D1EF17400FD3A53 /* Comment.swift */; };
|
||||
26EC14CC1D1EF17400FD3A53 /* CustomProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C51D1EF17400FD3A53 /* CustomProfile.swift */; };
|
||||
26EC14CD1D1EF17400FD3A53 /* CustomProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C51D1EF17400FD3A53 /* CustomProfile.swift */; };
|
||||
26EC14CE1D1EF17400FD3A53 /* CustomProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C51D1EF17400FD3A53 /* CustomProfile.swift */; };
|
||||
26EC14CF1D1EF17400FD3A53 /* CustomProfileField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C61D1EF17400FD3A53 /* CustomProfileField.swift */; };
|
||||
26EC14D01D1EF17400FD3A53 /* CustomProfileField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C61D1EF17400FD3A53 /* CustomProfileField.swift */; };
|
||||
26EC14D11D1EF17400FD3A53 /* CustomProfileField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C61D1EF17400FD3A53 /* CustomProfileField.swift */; };
|
||||
26EC14D21D1EF17400FD3A53 /* DoNotDisturbStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C71D1EF17400FD3A53 /* DoNotDisturbStatus.swift */; };
|
||||
26EC14D31D1EF17400FD3A53 /* DoNotDisturbStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C71D1EF17400FD3A53 /* DoNotDisturbStatus.swift */; };
|
||||
26EC14D41D1EF17400FD3A53 /* DoNotDisturbStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C71D1EF17400FD3A53 /* DoNotDisturbStatus.swift */; };
|
||||
26EC14D51D1EF17400FD3A53 /* Edited.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C81D1EF17400FD3A53 /* Edited.swift */; };
|
||||
26EC14D61D1EF17400FD3A53 /* Edited.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C81D1EF17400FD3A53 /* Edited.swift */; };
|
||||
26EC14D71D1EF17400FD3A53 /* Edited.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14C81D1EF17400FD3A53 /* Edited.swift */; };
|
||||
26EC14DA1D1EF17E00FD3A53 /* History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14D81D1EF17E00FD3A53 /* History.swift */; };
|
||||
26EC14DB1D1EF17E00FD3A53 /* History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14D81D1EF17E00FD3A53 /* History.swift */; };
|
||||
26EC14DC1D1EF17E00FD3A53 /* History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14D81D1EF17E00FD3A53 /* History.swift */; };
|
||||
26EC14DD1D1EF17E00FD3A53 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14D91D1EF17E00FD3A53 /* Item.swift */; };
|
||||
26EC14DE1D1EF17E00FD3A53 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14D91D1EF17E00FD3A53 /* Item.swift */; };
|
||||
26EC14DF1D1EF17E00FD3A53 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14D91D1EF17E00FD3A53 /* Item.swift */; };
|
||||
26EC14E11D1EF18700FD3A53 /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E01D1EF18700FD3A53 /* Reaction.swift */; };
|
||||
26EC14E21D1EF18700FD3A53 /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E01D1EF18700FD3A53 /* Reaction.swift */; };
|
||||
26EC14E31D1EF18700FD3A53 /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E01D1EF18700FD3A53 /* Reaction.swift */; };
|
||||
26EC14E61D1EF18F00FD3A53 /* TeamIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E41D1EF18F00FD3A53 /* TeamIcon.swift */; };
|
||||
26EC14E71D1EF18F00FD3A53 /* TeamIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E41D1EF18F00FD3A53 /* TeamIcon.swift */; };
|
||||
26EC14E81D1EF18F00FD3A53 /* TeamIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E41D1EF18F00FD3A53 /* TeamIcon.swift */; };
|
||||
26EC14E91D1EF18F00FD3A53 /* Topic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E51D1EF18F00FD3A53 /* Topic.swift */; };
|
||||
26EC14EA1D1EF18F00FD3A53 /* Topic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E51D1EF18F00FD3A53 /* Topic.swift */; };
|
||||
26EC14EB1D1EF18F00FD3A53 /* Topic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14E51D1EF18F00FD3A53 /* Topic.swift */; };
|
||||
26EC14F91D1F355A00FD3A53 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14F81D1F355A00FD3A53 /* Action.swift */; };
|
||||
26EC14FA1D1F355A00FD3A53 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14F81D1F355A00FD3A53 /* Action.swift */; };
|
||||
26EC14FB1D1F355A00FD3A53 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC14F81D1F355A00FD3A53 /* Action.swift */; };
|
||||
26EC15011D260B1000FD3A53 /* WebhookServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC15001D260B1000FD3A53 /* WebhookServer.swift */; };
|
||||
26EC15021D260B1000FD3A53 /* WebhookServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EC15001D260B1000FD3A53 /* WebhookServer.swift */; };
|
||||
C16C987A1CE7D3DD00692776 /* Client+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16C98791CE7D3DD00692776 /* Client+Utilities.swift */; };
|
||||
C1A85FF91CE3BCEF00756C40 /* Client+EventDispatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A85FF71CE3BCEF00756C40 /* Client+EventDispatching.swift */; };
|
||||
C1A85FFA1CE3BCEF00756C40 /* Client+EventHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1A85FF81CE3BCEF00756C40 /* Client+EventHandling.swift */; };
|
||||
26EAA8FB1E204DF6003F5423 /* SlackKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 26EAA8FA1E204DE6003F5423 /* SlackKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
26EAA8FC1E204DF6003F5423 /* SlackKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 26EAA8FA1E204DE6003F5423 /* SlackKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
26EAA8FD1E204DF7003F5423 /* SlackKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 26EAA8FA1E204DE6003F5423 /* SlackKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
26EAA92E1E204E47003F5423 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA8FF1E204E47003F5423 /* Action.swift */; };
|
||||
26EAA92F1E204E47003F5423 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA8FF1E204E47003F5423 /* Action.swift */; };
|
||||
26EAA9301E204E47003F5423 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA8FF1E204E47003F5423 /* Action.swift */; };
|
||||
26EAA9311E204E47003F5423 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9001E204E47003F5423 /* Attachment.swift */; };
|
||||
26EAA9321E204E47003F5423 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9001E204E47003F5423 /* Attachment.swift */; };
|
||||
26EAA9331E204E47003F5423 /* Attachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9001E204E47003F5423 /* Attachment.swift */; };
|
||||
26EAA9341E204E47003F5423 /* AttachmentField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9011E204E47003F5423 /* AttachmentField.swift */; };
|
||||
26EAA9351E204E47003F5423 /* AttachmentField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9011E204E47003F5423 /* AttachmentField.swift */; };
|
||||
26EAA9361E204E47003F5423 /* AttachmentField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9011E204E47003F5423 /* AttachmentField.swift */; };
|
||||
26EAA9371E204E47003F5423 /* AuthorizeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9031E204E47003F5423 /* AuthorizeRequest.swift */; };
|
||||
26EAA9381E204E47003F5423 /* AuthorizeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9031E204E47003F5423 /* AuthorizeRequest.swift */; };
|
||||
26EAA9391E204E47003F5423 /* AuthorizeRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9031E204E47003F5423 /* AuthorizeRequest.swift */; };
|
||||
26EAA93A1E204E47003F5423 /* AuthorizeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9041E204E47003F5423 /* AuthorizeResponse.swift */; };
|
||||
26EAA93B1E204E47003F5423 /* AuthorizeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9041E204E47003F5423 /* AuthorizeResponse.swift */; };
|
||||
26EAA93C1E204E47003F5423 /* AuthorizeResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9041E204E47003F5423 /* AuthorizeResponse.swift */; };
|
||||
26EAA93D1E204E47003F5423 /* OAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9051E204E47003F5423 /* OAuthResponse.swift */; };
|
||||
26EAA93E1E204E47003F5423 /* OAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9051E204E47003F5423 /* OAuthResponse.swift */; };
|
||||
26EAA93F1E204E47003F5423 /* OAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9051E204E47003F5423 /* OAuthResponse.swift */; };
|
||||
26EAA9401E204E47003F5423 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9061E204E47003F5423 /* Scope.swift */; };
|
||||
26EAA9411E204E47003F5423 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9061E204E47003F5423 /* Scope.swift */; };
|
||||
26EAA9421E204E47003F5423 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9061E204E47003F5423 /* Scope.swift */; };
|
||||
26EAA9431E204E47003F5423 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9071E204E47003F5423 /* Bot.swift */; };
|
||||
26EAA9441E204E47003F5423 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9071E204E47003F5423 /* Bot.swift */; };
|
||||
26EAA9451E204E47003F5423 /* Bot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9071E204E47003F5423 /* Bot.swift */; };
|
||||
26EAA9461E204E47003F5423 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9081E204E47003F5423 /* Channel.swift */; };
|
||||
26EAA9471E204E47003F5423 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9081E204E47003F5423 /* Channel.swift */; };
|
||||
26EAA9481E204E47003F5423 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9081E204E47003F5423 /* Channel.swift */; };
|
||||
26EAA9491E204E47003F5423 /* ClientOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9091E204E47003F5423 /* ClientOptions.swift */; };
|
||||
26EAA94A1E204E47003F5423 /* ClientOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9091E204E47003F5423 /* ClientOptions.swift */; };
|
||||
26EAA94B1E204E47003F5423 /* ClientOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9091E204E47003F5423 /* ClientOptions.swift */; };
|
||||
26EAA94C1E204E47003F5423 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90A1E204E47003F5423 /* Comment.swift */; };
|
||||
26EAA94D1E204E47003F5423 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90A1E204E47003F5423 /* Comment.swift */; };
|
||||
26EAA94E1E204E47003F5423 /* Comment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90A1E204E47003F5423 /* Comment.swift */; };
|
||||
26EAA94F1E204E47003F5423 /* CustomProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90B1E204E47003F5423 /* CustomProfile.swift */; };
|
||||
26EAA9501E204E47003F5423 /* CustomProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90B1E204E47003F5423 /* CustomProfile.swift */; };
|
||||
26EAA9511E204E47003F5423 /* CustomProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90B1E204E47003F5423 /* CustomProfile.swift */; };
|
||||
26EAA9521E204E47003F5423 /* CustomProfileField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90C1E204E47003F5423 /* CustomProfileField.swift */; };
|
||||
26EAA9531E204E47003F5423 /* CustomProfileField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90C1E204E47003F5423 /* CustomProfileField.swift */; };
|
||||
26EAA9541E204E47003F5423 /* CustomProfileField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90C1E204E47003F5423 /* CustomProfileField.swift */; };
|
||||
26EAA9551E204E47003F5423 /* DoNotDisturbStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90D1E204E47003F5423 /* DoNotDisturbStatus.swift */; };
|
||||
26EAA9561E204E47003F5423 /* DoNotDisturbStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90D1E204E47003F5423 /* DoNotDisturbStatus.swift */; };
|
||||
26EAA9571E204E47003F5423 /* DoNotDisturbStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90D1E204E47003F5423 /* DoNotDisturbStatus.swift */; };
|
||||
26EAA9581E204E47003F5423 /* Edited.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90E1E204E47003F5423 /* Edited.swift */; };
|
||||
26EAA9591E204E47003F5423 /* Edited.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90E1E204E47003F5423 /* Edited.swift */; };
|
||||
26EAA95A1E204E47003F5423 /* Edited.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90E1E204E47003F5423 /* Edited.swift */; };
|
||||
26EAA95B1E204E47003F5423 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90F1E204E47003F5423 /* Event.swift */; };
|
||||
26EAA95C1E204E47003F5423 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90F1E204E47003F5423 /* Event.swift */; };
|
||||
26EAA95D1E204E47003F5423 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA90F1E204E47003F5423 /* Event.swift */; };
|
||||
26EAA95E1E204E47003F5423 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9101E204E47003F5423 /* File.swift */; };
|
||||
26EAA95F1E204E47003F5423 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9101E204E47003F5423 /* File.swift */; };
|
||||
26EAA9601E204E47003F5423 /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9101E204E47003F5423 /* File.swift */; };
|
||||
26EAA9611E204E47003F5423 /* History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9111E204E47003F5423 /* History.swift */; };
|
||||
26EAA9621E204E47003F5423 /* History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9111E204E47003F5423 /* History.swift */; };
|
||||
26EAA9631E204E47003F5423 /* History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9111E204E47003F5423 /* History.swift */; };
|
||||
26EAA9641E204E47003F5423 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9121E204E47003F5423 /* Item.swift */; };
|
||||
26EAA9651E204E47003F5423 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9121E204E47003F5423 /* Item.swift */; };
|
||||
26EAA9661E204E47003F5423 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9121E204E47003F5423 /* Item.swift */; };
|
||||
26EAA9671E204E47003F5423 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9131E204E47003F5423 /* Message.swift */; };
|
||||
26EAA9681E204E47003F5423 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9131E204E47003F5423 /* Message.swift */; };
|
||||
26EAA9691E204E47003F5423 /* Message.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9131E204E47003F5423 /* Message.swift */; };
|
||||
26EAA96A1E204E47003F5423 /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9141E204E47003F5423 /* Reaction.swift */; };
|
||||
26EAA96B1E204E47003F5423 /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9141E204E47003F5423 /* Reaction.swift */; };
|
||||
26EAA96C1E204E47003F5423 /* Reaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9141E204E47003F5423 /* Reaction.swift */; };
|
||||
26EAA96D1E204E47003F5423 /* MessageActionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9161E204E47003F5423 /* MessageActionRequest.swift */; };
|
||||
26EAA96E1E204E47003F5423 /* MessageActionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9161E204E47003F5423 /* MessageActionRequest.swift */; };
|
||||
26EAA96F1E204E47003F5423 /* MessageActionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9161E204E47003F5423 /* MessageActionRequest.swift */; };
|
||||
26EAA9701E204E47003F5423 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9171E204E47003F5423 /* Response.swift */; };
|
||||
26EAA9711E204E47003F5423 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9171E204E47003F5423 /* Response.swift */; };
|
||||
26EAA9721E204E47003F5423 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9171E204E47003F5423 /* Response.swift */; };
|
||||
26EAA9731E204E47003F5423 /* WebhookRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9181E204E47003F5423 /* WebhookRequest.swift */; };
|
||||
26EAA9741E204E47003F5423 /* WebhookRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9181E204E47003F5423 /* WebhookRequest.swift */; };
|
||||
26EAA9751E204E47003F5423 /* WebhookRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9181E204E47003F5423 /* WebhookRequest.swift */; };
|
||||
26EAA9761E204E47003F5423 /* SlackError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9191E204E47003F5423 /* SlackError.swift */; };
|
||||
26EAA9771E204E47003F5423 /* SlackError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9191E204E47003F5423 /* SlackError.swift */; };
|
||||
26EAA9781E204E47003F5423 /* SlackError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9191E204E47003F5423 /* SlackError.swift */; };
|
||||
26EAA9791E204E47003F5423 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91A1E204E47003F5423 /* Team.swift */; };
|
||||
26EAA97A1E204E47003F5423 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91A1E204E47003F5423 /* Team.swift */; };
|
||||
26EAA97B1E204E47003F5423 /* Team.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91A1E204E47003F5423 /* Team.swift */; };
|
||||
26EAA97C1E204E47003F5423 /* TeamIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91B1E204E47003F5423 /* TeamIcon.swift */; };
|
||||
26EAA97D1E204E47003F5423 /* TeamIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91B1E204E47003F5423 /* TeamIcon.swift */; };
|
||||
26EAA97E1E204E47003F5423 /* TeamIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91B1E204E47003F5423 /* TeamIcon.swift */; };
|
||||
26EAA97F1E204E47003F5423 /* Topic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91C1E204E47003F5423 /* Topic.swift */; };
|
||||
26EAA9801E204E47003F5423 /* Topic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91C1E204E47003F5423 /* Topic.swift */; };
|
||||
26EAA9811E204E47003F5423 /* Topic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91C1E204E47003F5423 /* Topic.swift */; };
|
||||
26EAA9821E204E47003F5423 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91D1E204E47003F5423 /* User.swift */; };
|
||||
26EAA9831E204E47003F5423 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91D1E204E47003F5423 /* User.swift */; };
|
||||
26EAA9841E204E47003F5423 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91D1E204E47003F5423 /* User.swift */; };
|
||||
26EAA9851E204E47003F5423 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91E1E204E47003F5423 /* UserGroup.swift */; };
|
||||
26EAA9861E204E47003F5423 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91E1E204E47003F5423 /* UserGroup.swift */; };
|
||||
26EAA9871E204E47003F5423 /* UserGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91E1E204E47003F5423 /* UserGroup.swift */; };
|
||||
26EAA9881E204E47003F5423 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91F1E204E47003F5423 /* Client.swift */; };
|
||||
26EAA9891E204E47003F5423 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91F1E204E47003F5423 /* Client.swift */; };
|
||||
26EAA98A1E204E47003F5423 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA91F1E204E47003F5423 /* Client.swift */; };
|
||||
26EAA98B1E204E47003F5423 /* Client+EventDispatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9201E204E47003F5423 /* Client+EventDispatching.swift */; };
|
||||
26EAA98C1E204E47003F5423 /* Client+EventDispatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9201E204E47003F5423 /* Client+EventDispatching.swift */; };
|
||||
26EAA98D1E204E47003F5423 /* Client+EventDispatching.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9201E204E47003F5423 /* Client+EventDispatching.swift */; };
|
||||
26EAA98E1E204E47003F5423 /* Client+EventHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9211E204E47003F5423 /* Client+EventHandling.swift */; };
|
||||
26EAA98F1E204E47003F5423 /* Client+EventHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9211E204E47003F5423 /* Client+EventHandling.swift */; };
|
||||
26EAA9901E204E47003F5423 /* Client+EventHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9211E204E47003F5423 /* Client+EventHandling.swift */; };
|
||||
26EAA9911E204E47003F5423 /* Client+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9221E204E47003F5423 /* Client+Utilities.swift */; };
|
||||
26EAA9921E204E47003F5423 /* Client+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9221E204E47003F5423 /* Client+Utilities.swift */; };
|
||||
26EAA9931E204E47003F5423 /* Client+Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9221E204E47003F5423 /* Client+Utilities.swift */; };
|
||||
26EAA9941E204E47003F5423 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9231E204E47003F5423 /* EventDelegate.swift */; };
|
||||
26EAA9951E204E47003F5423 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9231E204E47003F5423 /* EventDelegate.swift */; };
|
||||
26EAA9961E204E47003F5423 /* EventDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9231E204E47003F5423 /* EventDelegate.swift */; };
|
||||
26EAA9971E204E47003F5423 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9241E204E47003F5423 /* Extensions.swift */; };
|
||||
26EAA9981E204E47003F5423 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9241E204E47003F5423 /* Extensions.swift */; };
|
||||
26EAA9991E204E47003F5423 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9241E204E47003F5423 /* Extensions.swift */; };
|
||||
26EAA99A1E204E47003F5423 /* IncomingWebhook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9251E204E47003F5423 /* IncomingWebhook.swift */; };
|
||||
26EAA99B1E204E47003F5423 /* IncomingWebhook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9251E204E47003F5423 /* IncomingWebhook.swift */; };
|
||||
26EAA99C1E204E47003F5423 /* IncomingWebhook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9251E204E47003F5423 /* IncomingWebhook.swift */; };
|
||||
26EAA99D1E204E47003F5423 /* MessageActionResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9261E204E47003F5423 /* MessageActionResponder.swift */; };
|
||||
26EAA99E1E204E47003F5423 /* MessageActionResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9261E204E47003F5423 /* MessageActionResponder.swift */; };
|
||||
26EAA99F1E204E47003F5423 /* MessageActionResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9261E204E47003F5423 /* MessageActionResponder.swift */; };
|
||||
26EAA9A01E204E47003F5423 /* MessageActionServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9271E204E47003F5423 /* MessageActionServer.swift */; };
|
||||
26EAA9A11E204E47003F5423 /* MessageActionServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9271E204E47003F5423 /* MessageActionServer.swift */; };
|
||||
26EAA9A21E204E47003F5423 /* MessageActionServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9271E204E47003F5423 /* MessageActionServer.swift */; };
|
||||
26EAA9A31E204E47003F5423 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9281E204E47003F5423 /* NetworkInterface.swift */; };
|
||||
26EAA9A41E204E47003F5423 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9281E204E47003F5423 /* NetworkInterface.swift */; };
|
||||
26EAA9A51E204E47003F5423 /* NetworkInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9281E204E47003F5423 /* NetworkInterface.swift */; };
|
||||
26EAA9A61E204E47003F5423 /* OAuthServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9291E204E47003F5423 /* OAuthServer.swift */; };
|
||||
26EAA9A71E204E47003F5423 /* OAuthServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9291E204E47003F5423 /* OAuthServer.swift */; };
|
||||
26EAA9A81E204E47003F5423 /* OAuthServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA9291E204E47003F5423 /* OAuthServer.swift */; };
|
||||
26EAA9A91E204E47003F5423 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92A1E204E47003F5423 /* Server.swift */; };
|
||||
26EAA9AA1E204E47003F5423 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92A1E204E47003F5423 /* Server.swift */; };
|
||||
26EAA9AB1E204E47003F5423 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92A1E204E47003F5423 /* Server.swift */; };
|
||||
26EAA9AC1E204E47003F5423 /* SlackKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92B1E204E47003F5423 /* SlackKit.swift */; };
|
||||
26EAA9AD1E204E47003F5423 /* SlackKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92B1E204E47003F5423 /* SlackKit.swift */; };
|
||||
26EAA9AE1E204E47003F5423 /* SlackKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92B1E204E47003F5423 /* SlackKit.swift */; };
|
||||
26EAA9AF1E204E47003F5423 /* WebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92C1E204E47003F5423 /* WebAPI.swift */; };
|
||||
26EAA9B01E204E47003F5423 /* WebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92C1E204E47003F5423 /* WebAPI.swift */; };
|
||||
26EAA9B11E204E47003F5423 /* WebAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92C1E204E47003F5423 /* WebAPI.swift */; };
|
||||
26EAA9B21E204E47003F5423 /* WebhookServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92D1E204E47003F5423 /* WebhookServer.swift */; };
|
||||
26EAA9B31E204E47003F5423 /* WebhookServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92D1E204E47003F5423 /* WebhookServer.swift */; };
|
||||
26EAA9B41E204E47003F5423 /* WebhookServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26EAA92D1E204E47003F5423 /* WebhookServer.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
2601D61A1C7646B80012BF22 /* SlackError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SlackError.swift; path = Sources/SlackError.swift; sourceTree = "<group>"; };
|
||||
26072A341BB48B3A00CD650C /* SlackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SlackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
260EC2301C4DC61D0093B253 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Sources/Extensions.swift; sourceTree = "<group>"; };
|
||||
260EC2311C4DC61D0093B253 /* NetworkInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkInterface.swift; path = Sources/NetworkInterface.swift; sourceTree = "<group>"; };
|
||||
260EC2321C4DC61D0093B253 /* WebAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebAPI.swift; path = Sources/WebAPI.swift; sourceTree = "<group>"; };
|
||||
263993B21CE90EE0004A6E93 /* SlackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SlackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
263993D11CE90EED004A6E93 /* SlackKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SlackKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
2659FC1E1DADC4F2003F3930 /* Starscream.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Starscream.framework; path = Carthage/Build/iOS/Starscream.framework; sourceTree = "<group>"; };
|
||||
2659FC211DADC4FC003F3930 /* Starscream.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Starscream.framework; path = Carthage/Build/tvOS/Starscream.framework; sourceTree = "<group>"; };
|
||||
2661A6A41BBF62FF0026F67B /* SlackKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlackKit.h; sourceTree = "<group>"; };
|
||||
2678B5931D3151B900CE521A /* AuthorizeResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AuthorizeResponse.swift; path = Sources/AuthorizeResponse.swift; sourceTree = "<group>"; };
|
||||
268E46131CE8F79D009F19CC /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-iOS.plist"; path = "Supporting Files/Info-iOS.plist"; sourceTree = "<group>"; };
|
||||
268E46141CE8F79D009F19CC /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-tvOS.plist"; path = "Supporting Files/Info-tvOS.plist"; sourceTree = "<group>"; };
|
||||
268E46151CE8F79D009F19CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Supporting Files/Info.plist"; sourceTree = "<group>"; };
|
||||
269B47591D3493DE0042D137 /* OAuthResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OAuthResponse.swift; path = Sources/OAuthResponse.swift; sourceTree = "<group>"; };
|
||||
269B475D1D3538E90042D137 /* SlackKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SlackKit.swift; path = Sources/SlackKit.swift; sourceTree = "<group>"; };
|
||||
269B47611D3544240042D137 /* IncomingWebhook.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IncomingWebhook.swift; path = Sources/IncomingWebhook.swift; sourceTree = "<group>"; };
|
||||
269B47651D39AAA80042D137 /* MessageActionResponder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageActionResponder.swift; path = Sources/MessageActionResponder.swift; sourceTree = "<group>"; };
|
||||
269B47CB1D3AE5670042D137 /* Swifter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Swifter.framework; path = Carthage/Build/tvOS/Swifter.framework; sourceTree = "<group>"; };
|
||||
269B47CD1D3C22FC0042D137 /* ClientOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ClientOptions.swift; path = Sources/ClientOptions.swift; sourceTree = "<group>"; };
|
||||
26B30B6B1D289FA0004D4AB5 /* Swifter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Swifter.framework; path = Carthage/Build/Mac/Swifter.framework; sourceTree = "<group>"; };
|
||||
26B30B6E1D289FB2004D4AB5 /* Swifter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Swifter.framework; path = Carthage/Build/iOS/Swifter.framework; sourceTree = "<group>"; };
|
||||
26B30B871D297A98004D4AB5 /* MessageActionRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageActionRequest.swift; path = Sources/MessageActionRequest.swift; sourceTree = "<group>"; };
|
||||
26B30B8F1D298E08004D4AB5 /* MessageActionServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageActionServer.swift; path = Sources/MessageActionServer.swift; sourceTree = "<group>"; };
|
||||
26B30B911D298E12004D4AB5 /* Server.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Server.swift; path = Sources/Server.swift; sourceTree = "<group>"; };
|
||||
26B30B931D298E78004D4AB5 /* Response.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Sources/Response.swift; sourceTree = "<group>"; };
|
||||
26B30B981D298F25004D4AB5 /* WebhookRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebhookRequest.swift; path = Sources/WebhookRequest.swift; sourceTree = "<group>"; };
|
||||
26B30BB51D2BC2E4004D4AB5 /* Scope.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Scope.swift; path = Sources/Scope.swift; sourceTree = "<group>"; };
|
||||
26B30BC21D2DFF0D004D4AB5 /* OAuthServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OAuthServer.swift; path = Sources/OAuthServer.swift; sourceTree = "<group>"; };
|
||||
26B30BC61D2DFF7D004D4AB5 /* AuthorizeRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AuthorizeRequest.swift; path = Sources/AuthorizeRequest.swift; sourceTree = "<group>"; };
|
||||
26BBA1871C398E3C00BF7225 /* Bot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Bot.swift; path = Sources/Bot.swift; sourceTree = "<group>"; };
|
||||
26BBA1881C398E3C00BF7225 /* Channel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Channel.swift; path = Sources/Channel.swift; sourceTree = "<group>"; };
|
||||
26BBA1891C398E3C00BF7225 /* Client.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Client.swift; path = Sources/Client.swift; sourceTree = "<group>"; };
|
||||
26BBA18A1C398E3C00BF7225 /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Event.swift; path = Sources/Event.swift; sourceTree = "<group>"; };
|
||||
26BBA18B1C398E3C00BF7225 /* EventDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EventDelegate.swift; path = Sources/EventDelegate.swift; sourceTree = "<group>"; };
|
||||
26BBA18E1C398E3C00BF7225 /* File.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = File.swift; path = Sources/File.swift; sourceTree = "<group>"; };
|
||||
26BBA18F1C398E3C00BF7225 /* Message.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Message.swift; path = Sources/Message.swift; sourceTree = "<group>"; };
|
||||
26BBA1901C398E3C00BF7225 /* Team.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Team.swift; path = Sources/Team.swift; sourceTree = "<group>"; };
|
||||
26BBA1921C398E3C00BF7225 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = User.swift; path = Sources/User.swift; sourceTree = "<group>"; };
|
||||
26BBA1931C398E3C00BF7225 /* UserGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UserGroup.swift; path = Sources/UserGroup.swift; sourceTree = "<group>"; };
|
||||
26DF40341C7A0FA300E19241 /* Attachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Attachment.swift; path = Sources/Attachment.swift; sourceTree = "<group>"; };
|
||||
26EC14C01D1EF16500FD3A53 /* AttachmentField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AttachmentField.swift; path = Sources/AttachmentField.swift; sourceTree = "<group>"; };
|
||||
26EC14C41D1EF17400FD3A53 /* Comment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Comment.swift; path = Sources/Comment.swift; sourceTree = "<group>"; };
|
||||
26EC14C51D1EF17400FD3A53 /* CustomProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CustomProfile.swift; path = Sources/CustomProfile.swift; sourceTree = "<group>"; };
|
||||
26EC14C61D1EF17400FD3A53 /* CustomProfileField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CustomProfileField.swift; path = Sources/CustomProfileField.swift; sourceTree = "<group>"; };
|
||||
26EC14C71D1EF17400FD3A53 /* DoNotDisturbStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DoNotDisturbStatus.swift; path = Sources/DoNotDisturbStatus.swift; sourceTree = "<group>"; };
|
||||
26EC14C81D1EF17400FD3A53 /* Edited.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Edited.swift; path = Sources/Edited.swift; sourceTree = "<group>"; };
|
||||
26EC14D81D1EF17E00FD3A53 /* History.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = History.swift; path = Sources/History.swift; sourceTree = "<group>"; };
|
||||
26EC14D91D1EF17E00FD3A53 /* Item.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Item.swift; path = Sources/Item.swift; sourceTree = "<group>"; };
|
||||
26EC14E01D1EF18700FD3A53 /* Reaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Reaction.swift; path = Sources/Reaction.swift; sourceTree = "<group>"; };
|
||||
26EC14E41D1EF18F00FD3A53 /* TeamIcon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TeamIcon.swift; path = Sources/TeamIcon.swift; sourceTree = "<group>"; };
|
||||
26EC14E51D1EF18F00FD3A53 /* Topic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Topic.swift; path = Sources/Topic.swift; sourceTree = "<group>"; };
|
||||
26EC14F81D1F355A00FD3A53 /* Action.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Action.swift; path = Sources/Action.swift; sourceTree = "<group>"; };
|
||||
26EC15001D260B1000FD3A53 /* WebhookServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebhookServer.swift; path = Sources/WebhookServer.swift; sourceTree = "<group>"; };
|
||||
26EAA8FA1E204DE6003F5423 /* SlackKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SlackKit.h; path = "Supporting Files/SlackKit.h"; sourceTree = SOURCE_ROOT; };
|
||||
26EAA8FF1E204E47003F5423 /* Action.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Action.swift; sourceTree = "<group>"; };
|
||||
26EAA9001E204E47003F5423 /* Attachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Attachment.swift; sourceTree = "<group>"; };
|
||||
26EAA9011E204E47003F5423 /* AttachmentField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttachmentField.swift; sourceTree = "<group>"; };
|
||||
26EAA9031E204E47003F5423 /* AuthorizeRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizeRequest.swift; sourceTree = "<group>"; };
|
||||
26EAA9041E204E47003F5423 /* AuthorizeResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthorizeResponse.swift; sourceTree = "<group>"; };
|
||||
26EAA9051E204E47003F5423 /* OAuthResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OAuthResponse.swift; sourceTree = "<group>"; };
|
||||
26EAA9061E204E47003F5423 /* Scope.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scope.swift; sourceTree = "<group>"; };
|
||||
26EAA9071E204E47003F5423 /* Bot.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bot.swift; sourceTree = "<group>"; };
|
||||
26EAA9081E204E47003F5423 /* Channel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Channel.swift; sourceTree = "<group>"; };
|
||||
26EAA9091E204E47003F5423 /* ClientOptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClientOptions.swift; sourceTree = "<group>"; };
|
||||
26EAA90A1E204E47003F5423 /* Comment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comment.swift; sourceTree = "<group>"; };
|
||||
26EAA90B1E204E47003F5423 /* CustomProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomProfile.swift; sourceTree = "<group>"; };
|
||||
26EAA90C1E204E47003F5423 /* CustomProfileField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomProfileField.swift; sourceTree = "<group>"; };
|
||||
26EAA90D1E204E47003F5423 /* DoNotDisturbStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DoNotDisturbStatus.swift; sourceTree = "<group>"; };
|
||||
26EAA90E1E204E47003F5423 /* Edited.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Edited.swift; sourceTree = "<group>"; };
|
||||
26EAA90F1E204E47003F5423 /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = "<group>"; };
|
||||
26EAA9101E204E47003F5423 /* File.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = "<group>"; };
|
||||
26EAA9111E204E47003F5423 /* History.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = History.swift; sourceTree = "<group>"; };
|
||||
26EAA9121E204E47003F5423 /* Item.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = "<group>"; };
|
||||
26EAA9131E204E47003F5423 /* Message.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Message.swift; sourceTree = "<group>"; };
|
||||
26EAA9141E204E47003F5423 /* Reaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reaction.swift; sourceTree = "<group>"; };
|
||||
26EAA9161E204E47003F5423 /* MessageActionRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageActionRequest.swift; sourceTree = "<group>"; };
|
||||
26EAA9171E204E47003F5423 /* Response.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Response.swift; sourceTree = "<group>"; };
|
||||
26EAA9181E204E47003F5423 /* WebhookRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebhookRequest.swift; sourceTree = "<group>"; };
|
||||
26EAA9191E204E47003F5423 /* SlackError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SlackError.swift; sourceTree = "<group>"; };
|
||||
26EAA91A1E204E47003F5423 /* Team.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Team.swift; sourceTree = "<group>"; };
|
||||
26EAA91B1E204E47003F5423 /* TeamIcon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TeamIcon.swift; sourceTree = "<group>"; };
|
||||
26EAA91C1E204E47003F5423 /* Topic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Topic.swift; sourceTree = "<group>"; };
|
||||
26EAA91D1E204E47003F5423 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
|
||||
26EAA91E1E204E47003F5423 /* UserGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserGroup.swift; sourceTree = "<group>"; };
|
||||
26EAA91F1E204E47003F5423 /* Client.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Client.swift; path = Sources/SlackKit/Client.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9201E204E47003F5423 /* Client+EventDispatching.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Client+EventDispatching.swift"; path = "Sources/SlackKit/Client+EventDispatching.swift"; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9211E204E47003F5423 /* Client+EventHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Client+EventHandling.swift"; path = "Sources/SlackKit/Client+EventHandling.swift"; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9221E204E47003F5423 /* Client+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Client+Utilities.swift"; path = "Sources/SlackKit/Client+Utilities.swift"; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9231E204E47003F5423 /* EventDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EventDelegate.swift; path = Sources/SlackKit/EventDelegate.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9241E204E47003F5423 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Sources/SlackKit/Extensions.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9251E204E47003F5423 /* IncomingWebhook.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = IncomingWebhook.swift; path = Sources/SlackKit/IncomingWebhook.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9261E204E47003F5423 /* MessageActionResponder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageActionResponder.swift; path = Sources/SlackKit/MessageActionResponder.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9271E204E47003F5423 /* MessageActionServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageActionServer.swift; path = Sources/SlackKit/MessageActionServer.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9281E204E47003F5423 /* NetworkInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NetworkInterface.swift; path = Sources/SlackKit/NetworkInterface.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA9291E204E47003F5423 /* OAuthServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OAuthServer.swift; path = Sources/SlackKit/OAuthServer.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA92A1E204E47003F5423 /* Server.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Server.swift; path = Sources/SlackKit/Server.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA92B1E204E47003F5423 /* SlackKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SlackKit.swift; path = Sources/SlackKit/SlackKit.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA92C1E204E47003F5423 /* WebAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebAPI.swift; path = Sources/SlackKit/WebAPI.swift; sourceTree = SOURCE_ROOT; };
|
||||
26EAA92D1E204E47003F5423 /* WebhookServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebhookServer.swift; path = Sources/SlackKit/WebhookServer.swift; sourceTree = SOURCE_ROOT; };
|
||||
4307A07F1CC6D0910011D5DE /* Starscream.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Starscream.framework; path = Carthage/Build/Mac/Starscream.framework; sourceTree = "<group>"; };
|
||||
C16C98791CE7D3DD00692776 /* Client+Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Client+Utilities.swift"; path = "Sources/Client+Utilities.swift"; sourceTree = "<group>"; };
|
||||
C1A85FF71CE3BCEF00756C40 /* Client+EventDispatching.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Client+EventDispatching.swift"; path = "Sources/Client+EventDispatching.swift"; sourceTree = "<group>"; };
|
||||
C1A85FF81CE3BCEF00756C40 /* Client+EventHandling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Client+EventHandling.swift"; path = "Sources/Client+EventHandling.swift"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -267,22 +267,22 @@
|
||||
2661A6811BBF60E60026F67B /* SlackKit */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
26BBA1891C398E3C00BF7225 /* Client.swift */,
|
||||
C1A85FF71CE3BCEF00756C40 /* Client+EventDispatching.swift */,
|
||||
C1A85FF81CE3BCEF00756C40 /* Client+EventHandling.swift */,
|
||||
C16C98791CE7D3DD00692776 /* Client+Utilities.swift */,
|
||||
26BBA18B1C398E3C00BF7225 /* EventDelegate.swift */,
|
||||
260EC2301C4DC61D0093B253 /* Extensions.swift */,
|
||||
269B47611D3544240042D137 /* IncomingWebhook.swift */,
|
||||
260EC2311C4DC61D0093B253 /* NetworkInterface.swift */,
|
||||
26B30B8F1D298E08004D4AB5 /* MessageActionServer.swift */,
|
||||
269B47651D39AAA80042D137 /* MessageActionResponder.swift */,
|
||||
26B30BC21D2DFF0D004D4AB5 /* OAuthServer.swift */,
|
||||
26B30B911D298E12004D4AB5 /* Server.swift */,
|
||||
269B475D1D3538E90042D137 /* SlackKit.swift */,
|
||||
260EC2321C4DC61D0093B253 /* WebAPI.swift */,
|
||||
26EC15001D260B1000FD3A53 /* WebhookServer.swift */,
|
||||
26EC14B31D1B974500FD3A53 /* Models */,
|
||||
26EAA8FE1E204E47003F5423 /* Model */,
|
||||
26EAA91F1E204E47003F5423 /* Client.swift */,
|
||||
26EAA9201E204E47003F5423 /* Client+EventDispatching.swift */,
|
||||
26EAA9211E204E47003F5423 /* Client+EventHandling.swift */,
|
||||
26EAA9221E204E47003F5423 /* Client+Utilities.swift */,
|
||||
26EAA9231E204E47003F5423 /* EventDelegate.swift */,
|
||||
26EAA9241E204E47003F5423 /* Extensions.swift */,
|
||||
26EAA9251E204E47003F5423 /* IncomingWebhook.swift */,
|
||||
26EAA9261E204E47003F5423 /* MessageActionResponder.swift */,
|
||||
26EAA9271E204E47003F5423 /* MessageActionServer.swift */,
|
||||
26EAA9281E204E47003F5423 /* NetworkInterface.swift */,
|
||||
26EAA9291E204E47003F5423 /* OAuthServer.swift */,
|
||||
26EAA92A1E204E47003F5423 /* Server.swift */,
|
||||
26EAA92B1E204E47003F5423 /* SlackKit.swift */,
|
||||
26EAA92C1E204E47003F5423 /* WebAPI.swift */,
|
||||
26EAA92D1E204E47003F5423 /* WebhookServer.swift */,
|
||||
268E46161CE8F7A2009F19CC /* Supporting Files */,
|
||||
);
|
||||
path = SlackKit;
|
||||
@@ -291,7 +291,7 @@
|
||||
268E46161CE8F7A2009F19CC /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2661A6A41BBF62FF0026F67B /* SlackKit.h */,
|
||||
26EAA8FA1E204DE6003F5423 /* SlackKit.h */,
|
||||
268E46151CE8F79D009F19CC /* Info.plist */,
|
||||
268E46131CE8F79D009F19CC /* Info-iOS.plist */,
|
||||
268E46141CE8F79D009F19CC /* Info-tvOS.plist */,
|
||||
@@ -299,57 +299,58 @@
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
26B30B9B1D29AB1E004D4AB5 /* Server */ = {
|
||||
26EAA8FE1E204E47003F5423 /* Model */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
26B30B871D297A98004D4AB5 /* MessageActionRequest.swift */,
|
||||
26B30B931D298E78004D4AB5 /* Response.swift */,
|
||||
26B30B981D298F25004D4AB5 /* WebhookRequest.swift */,
|
||||
26EAA9021E204E47003F5423 /* Auth */,
|
||||
26EAA9151E204E47003F5423 /* Server */,
|
||||
26EAA8FF1E204E47003F5423 /* Action.swift */,
|
||||
26EAA9001E204E47003F5423 /* Attachment.swift */,
|
||||
26EAA9011E204E47003F5423 /* AttachmentField.swift */,
|
||||
26EAA9071E204E47003F5423 /* Bot.swift */,
|
||||
26EAA9081E204E47003F5423 /* Channel.swift */,
|
||||
26EAA9091E204E47003F5423 /* ClientOptions.swift */,
|
||||
26EAA90A1E204E47003F5423 /* Comment.swift */,
|
||||
26EAA90B1E204E47003F5423 /* CustomProfile.swift */,
|
||||
26EAA90C1E204E47003F5423 /* CustomProfileField.swift */,
|
||||
26EAA90D1E204E47003F5423 /* DoNotDisturbStatus.swift */,
|
||||
26EAA90E1E204E47003F5423 /* Edited.swift */,
|
||||
26EAA90F1E204E47003F5423 /* Event.swift */,
|
||||
26EAA9101E204E47003F5423 /* File.swift */,
|
||||
26EAA9111E204E47003F5423 /* History.swift */,
|
||||
26EAA9121E204E47003F5423 /* Item.swift */,
|
||||
26EAA9131E204E47003F5423 /* Message.swift */,
|
||||
26EAA9141E204E47003F5423 /* Reaction.swift */,
|
||||
26EAA9191E204E47003F5423 /* SlackError.swift */,
|
||||
26EAA91A1E204E47003F5423 /* Team.swift */,
|
||||
26EAA91B1E204E47003F5423 /* TeamIcon.swift */,
|
||||
26EAA91C1E204E47003F5423 /* Topic.swift */,
|
||||
26EAA91D1E204E47003F5423 /* User.swift */,
|
||||
26EAA91E1E204E47003F5423 /* UserGroup.swift */,
|
||||
);
|
||||
name = Server;
|
||||
name = Model;
|
||||
path = Sources/SlackKit/Model;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
26EAA9021E204E47003F5423 /* Auth */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
26EAA9031E204E47003F5423 /* AuthorizeRequest.swift */,
|
||||
26EAA9041E204E47003F5423 /* AuthorizeResponse.swift */,
|
||||
26EAA9051E204E47003F5423 /* OAuthResponse.swift */,
|
||||
26EAA9061E204E47003F5423 /* Scope.swift */,
|
||||
);
|
||||
path = Auth;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
26B30BB91D2BC2EA004D4AB5 /* Auth */ = {
|
||||
26EAA9151E204E47003F5423 /* Server */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
26B30BC61D2DFF7D004D4AB5 /* AuthorizeRequest.swift */,
|
||||
2678B5931D3151B900CE521A /* AuthorizeResponse.swift */,
|
||||
26B30BB51D2BC2E4004D4AB5 /* Scope.swift */,
|
||||
269B47591D3493DE0042D137 /* OAuthResponse.swift */,
|
||||
26EAA9161E204E47003F5423 /* MessageActionRequest.swift */,
|
||||
26EAA9171E204E47003F5423 /* Response.swift */,
|
||||
26EAA9181E204E47003F5423 /* WebhookRequest.swift */,
|
||||
);
|
||||
name = Auth;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
26EC14B31D1B974500FD3A53 /* Models */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
26EC14F81D1F355A00FD3A53 /* Action.swift */,
|
||||
26DF40341C7A0FA300E19241 /* Attachment.swift */,
|
||||
26EC14C01D1EF16500FD3A53 /* AttachmentField.swift */,
|
||||
26BBA1871C398E3C00BF7225 /* Bot.swift */,
|
||||
26BBA1881C398E3C00BF7225 /* Channel.swift */,
|
||||
269B47CD1D3C22FC0042D137 /* ClientOptions.swift */,
|
||||
26EC14C41D1EF17400FD3A53 /* Comment.swift */,
|
||||
26EC14C51D1EF17400FD3A53 /* CustomProfile.swift */,
|
||||
26EC14C61D1EF17400FD3A53 /* CustomProfileField.swift */,
|
||||
26EC14C71D1EF17400FD3A53 /* DoNotDisturbStatus.swift */,
|
||||
26EC14C81D1EF17400FD3A53 /* Edited.swift */,
|
||||
26BBA18A1C398E3C00BF7225 /* Event.swift */,
|
||||
26BBA18E1C398E3C00BF7225 /* File.swift */,
|
||||
26EC14D81D1EF17E00FD3A53 /* History.swift */,
|
||||
26EC14D91D1EF17E00FD3A53 /* Item.swift */,
|
||||
26BBA18F1C398E3C00BF7225 /* Message.swift */,
|
||||
26EC14E01D1EF18700FD3A53 /* Reaction.swift */,
|
||||
2601D61A1C7646B80012BF22 /* SlackError.swift */,
|
||||
26BBA1901C398E3C00BF7225 /* Team.swift */,
|
||||
26EC14E41D1EF18F00FD3A53 /* TeamIcon.swift */,
|
||||
26EC14E51D1EF18F00FD3A53 /* Topic.swift */,
|
||||
26BBA1921C398E3C00BF7225 /* User.swift */,
|
||||
26BBA1931C398E3C00BF7225 /* UserGroup.swift */,
|
||||
26B30BB91D2BC2EA004D4AB5 /* Auth */,
|
||||
26B30B9B1D29AB1E004D4AB5 /* Server */,
|
||||
);
|
||||
name = Models;
|
||||
path = Server;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CA70A3A1A9A1A259960DFBCF /* Frameworks */ = {
|
||||
@@ -372,7 +373,7 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
263993901CE90C87004A6E93 /* SlackKit.h in Headers */,
|
||||
26EAA8FD1E204DF7003F5423 /* SlackKit.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -380,7 +381,7 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
263993AD1CE90EE0004A6E93 /* SlackKit.h in Headers */,
|
||||
26EAA8FC1E204DF6003F5423 /* SlackKit.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -388,7 +389,7 @@
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
263993CC1CE90EED004A6E93 /* SlackKit.h in Headers */,
|
||||
26EAA8FB1E204DF6003F5423 /* SlackKit.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -461,7 +462,13 @@
|
||||
TargetAttributes = {
|
||||
26072A331BB48B3A00CD650C = {
|
||||
CreatedOnToolsVersion = 7.0;
|
||||
LastSwiftMigration = 0800;
|
||||
LastSwiftMigration = 0820;
|
||||
};
|
||||
263993951CE90EE0004A6E93 = {
|
||||
LastSwiftMigration = 0820;
|
||||
};
|
||||
263993B41CE90EED004A6E93 = {
|
||||
LastSwiftMigration = 0820;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -514,51 +521,51 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
2678B5941D3151B900CE521A /* AuthorizeResponse.swift in Sources */,
|
||||
26B30B921D298E12004D4AB5 /* Server.swift in Sources */,
|
||||
269B47CE1D3C22FC0042D137 /* ClientOptions.swift in Sources */,
|
||||
269B47621D3544240042D137 /* IncomingWebhook.swift in Sources */,
|
||||
C16C987A1CE7D3DD00692776 /* Client+Utilities.swift in Sources */,
|
||||
26BBA1951C398E3C00BF7225 /* Channel.swift in Sources */,
|
||||
26B30B901D298E08004D4AB5 /* MessageActionServer.swift in Sources */,
|
||||
26B30B941D298E78004D4AB5 /* Response.swift in Sources */,
|
||||
26EC14CF1D1EF17400FD3A53 /* CustomProfileField.swift in Sources */,
|
||||
269B47661D39AAA80042D137 /* MessageActionResponder.swift in Sources */,
|
||||
26BBA19F1C398E3C00BF7225 /* User.swift in Sources */,
|
||||
26EC14DD1D1EF17E00FD3A53 /* Item.swift in Sources */,
|
||||
26EC15011D260B1000FD3A53 /* WebhookServer.swift in Sources */,
|
||||
26EC14CC1D1EF17400FD3A53 /* CustomProfile.swift in Sources */,
|
||||
26BBA1961C398E3C00BF7225 /* Client.swift in Sources */,
|
||||
26B30B881D297A98004D4AB5 /* MessageActionRequest.swift in Sources */,
|
||||
269B475E1D3538E90042D137 /* SlackKit.swift in Sources */,
|
||||
26B30BC71D2DFF7D004D4AB5 /* AuthorizeRequest.swift in Sources */,
|
||||
26BBA1971C398E3C00BF7225 /* Event.swift in Sources */,
|
||||
26EC14D21D1EF17400FD3A53 /* DoNotDisturbStatus.swift in Sources */,
|
||||
26BBA1941C398E3C00BF7225 /* Bot.swift in Sources */,
|
||||
26EC14E61D1EF18F00FD3A53 /* TeamIcon.swift in Sources */,
|
||||
C1A85FF91CE3BCEF00756C40 /* Client+EventDispatching.swift in Sources */,
|
||||
26BBA19B1C398E3C00BF7225 /* File.swift in Sources */,
|
||||
26EC14F91D1F355A00FD3A53 /* Action.swift in Sources */,
|
||||
26B30BC31D2DFF0D004D4AB5 /* OAuthServer.swift in Sources */,
|
||||
26EC14D51D1EF17400FD3A53 /* Edited.swift in Sources */,
|
||||
260EC2351C4DC61D0093B253 /* WebAPI.swift in Sources */,
|
||||
26EC14E11D1EF18700FD3A53 /* Reaction.swift in Sources */,
|
||||
26B30BB61D2BC2E4004D4AB5 /* Scope.swift in Sources */,
|
||||
26EC14E91D1EF18F00FD3A53 /* Topic.swift in Sources */,
|
||||
26DF40351C7A0FA300E19241 /* Attachment.swift in Sources */,
|
||||
26BBA19C1C398E3C00BF7225 /* Message.swift in Sources */,
|
||||
26BBA19D1C398E3C00BF7225 /* Team.swift in Sources */,
|
||||
260EC2331C4DC61D0093B253 /* Extensions.swift in Sources */,
|
||||
26BBA1A01C398E3C00BF7225 /* UserGroup.swift in Sources */,
|
||||
2601D61B1C7646B80012BF22 /* SlackError.swift in Sources */,
|
||||
26EC14DA1D1EF17E00FD3A53 /* History.swift in Sources */,
|
||||
269B475A1D3493DE0042D137 /* OAuthResponse.swift in Sources */,
|
||||
C1A85FFA1CE3BCEF00756C40 /* Client+EventHandling.swift in Sources */,
|
||||
26B30B991D298F25004D4AB5 /* WebhookRequest.swift in Sources */,
|
||||
26EC14C91D1EF17400FD3A53 /* Comment.swift in Sources */,
|
||||
26EC14C11D1EF16500FD3A53 /* AttachmentField.swift in Sources */,
|
||||
260EC2341C4DC61D0093B253 /* NetworkInterface.swift in Sources */,
|
||||
26BBA1981C398E3C00BF7225 /* EventDelegate.swift in Sources */,
|
||||
26EAA99A1E204E47003F5423 /* IncomingWebhook.swift in Sources */,
|
||||
26EAA98E1E204E47003F5423 /* Client+EventHandling.swift in Sources */,
|
||||
26EAA9911E204E47003F5423 /* Client+Utilities.swift in Sources */,
|
||||
26EAA9AC1E204E47003F5423 /* SlackKit.swift in Sources */,
|
||||
26EAA9611E204E47003F5423 /* History.swift in Sources */,
|
||||
26EAA9341E204E47003F5423 /* AttachmentField.swift in Sources */,
|
||||
26EAA9791E204E47003F5423 /* Team.swift in Sources */,
|
||||
26EAA9431E204E47003F5423 /* Bot.swift in Sources */,
|
||||
26EAA9401E204E47003F5423 /* Scope.swift in Sources */,
|
||||
26EAA9B21E204E47003F5423 /* WebhookServer.swift in Sources */,
|
||||
26EAA9371E204E47003F5423 /* AuthorizeRequest.swift in Sources */,
|
||||
26EAA93D1E204E47003F5423 /* OAuthResponse.swift in Sources */,
|
||||
26EAA9A61E204E47003F5423 /* OAuthServer.swift in Sources */,
|
||||
26EAA93A1E204E47003F5423 /* AuthorizeResponse.swift in Sources */,
|
||||
26EAA9821E204E47003F5423 /* User.swift in Sources */,
|
||||
26EAA9761E204E47003F5423 /* SlackError.swift in Sources */,
|
||||
26EAA9731E204E47003F5423 /* WebhookRequest.swift in Sources */,
|
||||
26EAA9581E204E47003F5423 /* Edited.swift in Sources */,
|
||||
26EAA94F1E204E47003F5423 /* CustomProfile.swift in Sources */,
|
||||
26EAA96D1E204E47003F5423 /* MessageActionRequest.swift in Sources */,
|
||||
26EAA9AF1E204E47003F5423 /* WebAPI.swift in Sources */,
|
||||
26EAA97F1E204E47003F5423 /* Topic.swift in Sources */,
|
||||
26EAA9941E204E47003F5423 /* EventDelegate.swift in Sources */,
|
||||
26EAA95B1E204E47003F5423 /* Event.swift in Sources */,
|
||||
26EAA9971E204E47003F5423 /* Extensions.swift in Sources */,
|
||||
26EAA9851E204E47003F5423 /* UserGroup.swift in Sources */,
|
||||
26EAA9521E204E47003F5423 /* CustomProfileField.swift in Sources */,
|
||||
26EAA98B1E204E47003F5423 /* Client+EventDispatching.swift in Sources */,
|
||||
26EAA99D1E204E47003F5423 /* MessageActionResponder.swift in Sources */,
|
||||
26EAA9551E204E47003F5423 /* DoNotDisturbStatus.swift in Sources */,
|
||||
26EAA95E1E204E47003F5423 /* File.swift in Sources */,
|
||||
26EAA9A91E204E47003F5423 /* Server.swift in Sources */,
|
||||
26EAA9311E204E47003F5423 /* Attachment.swift in Sources */,
|
||||
26EAA9A31E204E47003F5423 /* NetworkInterface.swift in Sources */,
|
||||
26EAA9641E204E47003F5423 /* Item.swift in Sources */,
|
||||
26EAA9491E204E47003F5423 /* ClientOptions.swift in Sources */,
|
||||
26EAA96A1E204E47003F5423 /* Reaction.swift in Sources */,
|
||||
26EAA9461E204E47003F5423 /* Channel.swift in Sources */,
|
||||
26EAA9671E204E47003F5423 /* Message.swift in Sources */,
|
||||
26EAA97C1E204E47003F5423 /* TeamIcon.swift in Sources */,
|
||||
26EAA9881E204E47003F5423 /* Client.swift in Sources */,
|
||||
26EAA9A01E204E47003F5423 /* MessageActionServer.swift in Sources */,
|
||||
26EAA9701E204E47003F5423 /* Response.swift in Sources */,
|
||||
26EAA94C1E204E47003F5423 /* Comment.swift in Sources */,
|
||||
26EAA92E1E204E47003F5423 /* Action.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -566,51 +573,51 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
26B30B961D298EE1004D4AB5 /* MessageActionRequest.swift in Sources */,
|
||||
263993971CE90EE0004A6E93 /* Client+Utilities.swift in Sources */,
|
||||
269B47CF1D3C22FC0042D137 /* ClientOptions.swift in Sources */,
|
||||
269B47C71D3AE25B0042D137 /* MessageActionServer.swift in Sources */,
|
||||
263993981CE90EE0004A6E93 /* Channel.swift in Sources */,
|
||||
26EC14D01D1EF17400FD3A53 /* CustomProfileField.swift in Sources */,
|
||||
263993991CE90EE0004A6E93 /* User.swift in Sources */,
|
||||
26EC14DE1D1EF17E00FD3A53 /* Item.swift in Sources */,
|
||||
269B475B1D3493DE0042D137 /* OAuthResponse.swift in Sources */,
|
||||
26EC15021D260B1000FD3A53 /* WebhookServer.swift in Sources */,
|
||||
26B30BC41D2DFF0D004D4AB5 /* OAuthServer.swift in Sources */,
|
||||
26EC14CD1D1EF17400FD3A53 /* CustomProfile.swift in Sources */,
|
||||
2639939B1CE90EE0004A6E93 /* Client.swift in Sources */,
|
||||
2639939C1CE90EE0004A6E93 /* Event.swift in Sources */,
|
||||
26B30BC81D2DFF7D004D4AB5 /* AuthorizeRequest.swift in Sources */,
|
||||
2678B5951D3151B900CE521A /* AuthorizeResponse.swift in Sources */,
|
||||
26EC14D31D1EF17400FD3A53 /* DoNotDisturbStatus.swift in Sources */,
|
||||
2639939D1CE90EE0004A6E93 /* Bot.swift in Sources */,
|
||||
26EC14E71D1EF18F00FD3A53 /* TeamIcon.swift in Sources */,
|
||||
2639939E1CE90EE0004A6E93 /* Client+EventDispatching.swift in Sources */,
|
||||
26B30B971D298EED004D4AB5 /* Server.swift in Sources */,
|
||||
2639939F1CE90EE0004A6E93 /* File.swift in Sources */,
|
||||
26B30B951D298E78004D4AB5 /* Response.swift in Sources */,
|
||||
26EC14FA1D1F355A00FD3A53 /* Action.swift in Sources */,
|
||||
26EC14D61D1EF17400FD3A53 /* Edited.swift in Sources */,
|
||||
263993A01CE90EE0004A6E93 /* WebAPI.swift in Sources */,
|
||||
26B30B9A1D298F25004D4AB5 /* WebhookRequest.swift in Sources */,
|
||||
26EC14E21D1EF18700FD3A53 /* Reaction.swift in Sources */,
|
||||
26EC14EA1D1EF18F00FD3A53 /* Topic.swift in Sources */,
|
||||
263993A11CE90EE0004A6E93 /* Attachment.swift in Sources */,
|
||||
26B30BB71D2BC2E4004D4AB5 /* Scope.swift in Sources */,
|
||||
263993A21CE90EE0004A6E93 /* Message.swift in Sources */,
|
||||
263993A31CE90EE0004A6E93 /* Team.swift in Sources */,
|
||||
263993A41CE90EE0004A6E93 /* Extensions.swift in Sources */,
|
||||
263993A51CE90EE0004A6E93 /* UserGroup.swift in Sources */,
|
||||
263993A61CE90EE0004A6E93 /* SlackError.swift in Sources */,
|
||||
269B475F1D3538E90042D137 /* SlackKit.swift in Sources */,
|
||||
26EC14DB1D1EF17E00FD3A53 /* History.swift in Sources */,
|
||||
263993A71CE90EE0004A6E93 /* Client+EventHandling.swift in Sources */,
|
||||
269B47631D3544240042D137 /* IncomingWebhook.swift in Sources */,
|
||||
269B47671D39AAA80042D137 /* MessageActionResponder.swift in Sources */,
|
||||
26EC14CA1D1EF17400FD3A53 /* Comment.swift in Sources */,
|
||||
26EC14C21D1EF16500FD3A53 /* AttachmentField.swift in Sources */,
|
||||
263993A81CE90EE0004A6E93 /* NetworkInterface.swift in Sources */,
|
||||
263993A91CE90EE0004A6E93 /* EventDelegate.swift in Sources */,
|
||||
26EAA99B1E204E47003F5423 /* IncomingWebhook.swift in Sources */,
|
||||
26EAA98F1E204E47003F5423 /* Client+EventHandling.swift in Sources */,
|
||||
26EAA9921E204E47003F5423 /* Client+Utilities.swift in Sources */,
|
||||
26EAA9AD1E204E47003F5423 /* SlackKit.swift in Sources */,
|
||||
26EAA9621E204E47003F5423 /* History.swift in Sources */,
|
||||
26EAA9351E204E47003F5423 /* AttachmentField.swift in Sources */,
|
||||
26EAA97A1E204E47003F5423 /* Team.swift in Sources */,
|
||||
26EAA9441E204E47003F5423 /* Bot.swift in Sources */,
|
||||
26EAA9411E204E47003F5423 /* Scope.swift in Sources */,
|
||||
26EAA9B31E204E47003F5423 /* WebhookServer.swift in Sources */,
|
||||
26EAA9381E204E47003F5423 /* AuthorizeRequest.swift in Sources */,
|
||||
26EAA93E1E204E47003F5423 /* OAuthResponse.swift in Sources */,
|
||||
26EAA9A71E204E47003F5423 /* OAuthServer.swift in Sources */,
|
||||
26EAA93B1E204E47003F5423 /* AuthorizeResponse.swift in Sources */,
|
||||
26EAA9831E204E47003F5423 /* User.swift in Sources */,
|
||||
26EAA9771E204E47003F5423 /* SlackError.swift in Sources */,
|
||||
26EAA9741E204E47003F5423 /* WebhookRequest.swift in Sources */,
|
||||
26EAA9591E204E47003F5423 /* Edited.swift in Sources */,
|
||||
26EAA9501E204E47003F5423 /* CustomProfile.swift in Sources */,
|
||||
26EAA96E1E204E47003F5423 /* MessageActionRequest.swift in Sources */,
|
||||
26EAA9B01E204E47003F5423 /* WebAPI.swift in Sources */,
|
||||
26EAA9801E204E47003F5423 /* Topic.swift in Sources */,
|
||||
26EAA9951E204E47003F5423 /* EventDelegate.swift in Sources */,
|
||||
26EAA95C1E204E47003F5423 /* Event.swift in Sources */,
|
||||
26EAA9981E204E47003F5423 /* Extensions.swift in Sources */,
|
||||
26EAA9861E204E47003F5423 /* UserGroup.swift in Sources */,
|
||||
26EAA9531E204E47003F5423 /* CustomProfileField.swift in Sources */,
|
||||
26EAA98C1E204E47003F5423 /* Client+EventDispatching.swift in Sources */,
|
||||
26EAA99E1E204E47003F5423 /* MessageActionResponder.swift in Sources */,
|
||||
26EAA9561E204E47003F5423 /* DoNotDisturbStatus.swift in Sources */,
|
||||
26EAA95F1E204E47003F5423 /* File.swift in Sources */,
|
||||
26EAA9AA1E204E47003F5423 /* Server.swift in Sources */,
|
||||
26EAA9321E204E47003F5423 /* Attachment.swift in Sources */,
|
||||
26EAA9A41E204E47003F5423 /* NetworkInterface.swift in Sources */,
|
||||
26EAA9651E204E47003F5423 /* Item.swift in Sources */,
|
||||
26EAA94A1E204E47003F5423 /* ClientOptions.swift in Sources */,
|
||||
26EAA96B1E204E47003F5423 /* Reaction.swift in Sources */,
|
||||
26EAA9471E204E47003F5423 /* Channel.swift in Sources */,
|
||||
26EAA9681E204E47003F5423 /* Message.swift in Sources */,
|
||||
26EAA97D1E204E47003F5423 /* TeamIcon.swift in Sources */,
|
||||
26EAA9891E204E47003F5423 /* Client.swift in Sources */,
|
||||
26EAA9A11E204E47003F5423 /* MessageActionServer.swift in Sources */,
|
||||
26EAA9711E204E47003F5423 /* Response.swift in Sources */,
|
||||
26EAA94D1E204E47003F5423 /* Comment.swift in Sources */,
|
||||
26EAA92F1E204E47003F5423 /* Action.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -618,51 +625,51 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
263993B61CE90EED004A6E93 /* Client+Utilities.swift in Sources */,
|
||||
263993B71CE90EED004A6E93 /* Channel.swift in Sources */,
|
||||
269B47D01D3C22FC0042D137 /* ClientOptions.swift in Sources */,
|
||||
26EC14D11D1EF17400FD3A53 /* CustomProfileField.swift in Sources */,
|
||||
263993B81CE90EED004A6E93 /* User.swift in Sources */,
|
||||
26EC14DF1D1EF17E00FD3A53 /* Item.swift in Sources */,
|
||||
2678B5981D3151C900CE521A /* Response.swift in Sources */,
|
||||
269B475C1D3493DE0042D137 /* OAuthResponse.swift in Sources */,
|
||||
26EC14CE1D1EF17400FD3A53 /* CustomProfile.swift in Sources */,
|
||||
269B47C91D3AE2620042D137 /* Server.swift in Sources */,
|
||||
263993BA1CE90EED004A6E93 /* Client.swift in Sources */,
|
||||
263993BB1CE90EED004A6E93 /* Event.swift in Sources */,
|
||||
269B47CA1D3AE2670042D137 /* WebhookServer.swift in Sources */,
|
||||
26EC14D41D1EF17400FD3A53 /* DoNotDisturbStatus.swift in Sources */,
|
||||
263993BC1CE90EED004A6E93 /* Bot.swift in Sources */,
|
||||
26EC14E81D1EF18F00FD3A53 /* TeamIcon.swift in Sources */,
|
||||
263993BD1CE90EED004A6E93 /* Client+EventDispatching.swift in Sources */,
|
||||
263993BE1CE90EED004A6E93 /* File.swift in Sources */,
|
||||
26B30BB81D2BC2E4004D4AB5 /* Scope.swift in Sources */,
|
||||
269B47601D3538E90042D137 /* SlackKit.swift in Sources */,
|
||||
2678B5991D3151CD00CE521A /* WebhookRequest.swift in Sources */,
|
||||
26EC14FB1D1F355A00FD3A53 /* Action.swift in Sources */,
|
||||
26EC14D71D1EF17400FD3A53 /* Edited.swift in Sources */,
|
||||
263993BF1CE90EED004A6E93 /* WebAPI.swift in Sources */,
|
||||
2678B5961D3151B900CE521A /* AuthorizeResponse.swift in Sources */,
|
||||
26EC14E31D1EF18700FD3A53 /* Reaction.swift in Sources */,
|
||||
26EC14EB1D1EF18F00FD3A53 /* Topic.swift in Sources */,
|
||||
26B30BC51D2DFF0D004D4AB5 /* OAuthServer.swift in Sources */,
|
||||
263993C01CE90EED004A6E93 /* Attachment.swift in Sources */,
|
||||
263993C11CE90EED004A6E93 /* Message.swift in Sources */,
|
||||
263993C21CE90EED004A6E93 /* Team.swift in Sources */,
|
||||
269B47681D39AAA80042D137 /* MessageActionResponder.swift in Sources */,
|
||||
263993C31CE90EED004A6E93 /* Extensions.swift in Sources */,
|
||||
2678B5971D3151C600CE521A /* MessageActionRequest.swift in Sources */,
|
||||
263993C41CE90EED004A6E93 /* UserGroup.swift in Sources */,
|
||||
269B47C81D3AE25B0042D137 /* MessageActionServer.swift in Sources */,
|
||||
263993C51CE90EED004A6E93 /* SlackError.swift in Sources */,
|
||||
26EC14DC1D1EF17E00FD3A53 /* History.swift in Sources */,
|
||||
263993C61CE90EED004A6E93 /* Client+EventHandling.swift in Sources */,
|
||||
26B30BC91D2DFF7D004D4AB5 /* AuthorizeRequest.swift in Sources */,
|
||||
269B47641D3544240042D137 /* IncomingWebhook.swift in Sources */,
|
||||
26EC14CB1D1EF17400FD3A53 /* Comment.swift in Sources */,
|
||||
26EC14C31D1EF16500FD3A53 /* AttachmentField.swift in Sources */,
|
||||
263993C71CE90EED004A6E93 /* NetworkInterface.swift in Sources */,
|
||||
263993C81CE90EED004A6E93 /* EventDelegate.swift in Sources */,
|
||||
26EAA99C1E204E47003F5423 /* IncomingWebhook.swift in Sources */,
|
||||
26EAA9901E204E47003F5423 /* Client+EventHandling.swift in Sources */,
|
||||
26EAA9931E204E47003F5423 /* Client+Utilities.swift in Sources */,
|
||||
26EAA9AE1E204E47003F5423 /* SlackKit.swift in Sources */,
|
||||
26EAA9631E204E47003F5423 /* History.swift in Sources */,
|
||||
26EAA9361E204E47003F5423 /* AttachmentField.swift in Sources */,
|
||||
26EAA97B1E204E47003F5423 /* Team.swift in Sources */,
|
||||
26EAA9451E204E47003F5423 /* Bot.swift in Sources */,
|
||||
26EAA9421E204E47003F5423 /* Scope.swift in Sources */,
|
||||
26EAA9B41E204E47003F5423 /* WebhookServer.swift in Sources */,
|
||||
26EAA9391E204E47003F5423 /* AuthorizeRequest.swift in Sources */,
|
||||
26EAA93F1E204E47003F5423 /* OAuthResponse.swift in Sources */,
|
||||
26EAA9A81E204E47003F5423 /* OAuthServer.swift in Sources */,
|
||||
26EAA93C1E204E47003F5423 /* AuthorizeResponse.swift in Sources */,
|
||||
26EAA9841E204E47003F5423 /* User.swift in Sources */,
|
||||
26EAA9781E204E47003F5423 /* SlackError.swift in Sources */,
|
||||
26EAA9751E204E47003F5423 /* WebhookRequest.swift in Sources */,
|
||||
26EAA95A1E204E47003F5423 /* Edited.swift in Sources */,
|
||||
26EAA9511E204E47003F5423 /* CustomProfile.swift in Sources */,
|
||||
26EAA96F1E204E47003F5423 /* MessageActionRequest.swift in Sources */,
|
||||
26EAA9B11E204E47003F5423 /* WebAPI.swift in Sources */,
|
||||
26EAA9811E204E47003F5423 /* Topic.swift in Sources */,
|
||||
26EAA9961E204E47003F5423 /* EventDelegate.swift in Sources */,
|
||||
26EAA95D1E204E47003F5423 /* Event.swift in Sources */,
|
||||
26EAA9991E204E47003F5423 /* Extensions.swift in Sources */,
|
||||
26EAA9871E204E47003F5423 /* UserGroup.swift in Sources */,
|
||||
26EAA9541E204E47003F5423 /* CustomProfileField.swift in Sources */,
|
||||
26EAA98D1E204E47003F5423 /* Client+EventDispatching.swift in Sources */,
|
||||
26EAA99F1E204E47003F5423 /* MessageActionResponder.swift in Sources */,
|
||||
26EAA9571E204E47003F5423 /* DoNotDisturbStatus.swift in Sources */,
|
||||
26EAA9601E204E47003F5423 /* File.swift in Sources */,
|
||||
26EAA9AB1E204E47003F5423 /* Server.swift in Sources */,
|
||||
26EAA9331E204E47003F5423 /* Attachment.swift in Sources */,
|
||||
26EAA9A51E204E47003F5423 /* NetworkInterface.swift in Sources */,
|
||||
26EAA9661E204E47003F5423 /* Item.swift in Sources */,
|
||||
26EAA94B1E204E47003F5423 /* ClientOptions.swift in Sources */,
|
||||
26EAA96C1E204E47003F5423 /* Reaction.swift in Sources */,
|
||||
26EAA9481E204E47003F5423 /* Channel.swift in Sources */,
|
||||
26EAA9691E204E47003F5423 /* Message.swift in Sources */,
|
||||
26EAA97E1E204E47003F5423 /* TeamIcon.swift in Sources */,
|
||||
26EAA98A1E204E47003F5423 /* Client.swift in Sources */,
|
||||
26EAA9A21E204E47003F5423 /* MessageActionServer.swift in Sources */,
|
||||
26EAA9721E204E47003F5423 /* Response.swift in Sources */,
|
||||
26EAA94E1E204E47003F5423 /* Comment.swift in Sources */,
|
||||
26EAA9301E204E47003F5423 /* Action.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -774,7 +781,7 @@
|
||||
"$(PROJECT_DIR)/Carthage/Build/Mac",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info-iOS.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
@@ -801,7 +808,7 @@
|
||||
"$(PROJECT_DIR)/Carthage/Build/Mac",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info-iOS.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
@@ -829,7 +836,7 @@
|
||||
"$(PROJECT_DIR)/Carthage/Build/iOS",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info-iOS.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info-iOS.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
@@ -860,7 +867,7 @@
|
||||
"$(PROJECT_DIR)/Carthage/Build/iOS",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info-iOS.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info-iOS.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
@@ -890,7 +897,7 @@
|
||||
"$(PROJECT_DIR)/Carthage/Build/tvOS",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info-tvOS.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info-tvOS.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
@@ -920,7 +927,7 @@
|
||||
"$(PROJECT_DIR)/Carthage/Build/tvOS",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info-tvOS.plist";
|
||||
INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info-tvOS.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:SlackRTMKit.xcodeproj">
|
||||
location = "self:SlackKit.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
//
|
||||
// SlackError.swift
|
||||
//
|
||||
// Copyright © 2016 Peter Zignego. All rights reserved.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
public enum SlackError: String, Error {
|
||||
|
||||
case AccountInactive = "account_inactive"
|
||||
case AlreadyArchived = "already_archived"
|
||||
case AlreadyInChannel = "already_in_channel"
|
||||
case AlreadyPinned = "already_pinned"
|
||||
case AlreadyReacted = "already_reacted"
|
||||
case AlreadyStarred = "already_starred"
|
||||
case BadClientSecret = "bad_client_secret"
|
||||
case BadRedirectURI = "bad_redirect_uri"
|
||||
case BadTimeStamp = "bad_timestamp"
|
||||
case CantArchiveGeneral = "cant_archive_general"
|
||||
case CantDelete = "cant_delete"
|
||||
case CantDeleteFile = "cant_delete_file"
|
||||
case CantDeleteMessage = "cant_delete_message"
|
||||
case CantInvite = "cant_invite"
|
||||
case CantInviteSelf = "cant_invite_self"
|
||||
case CantKickFromGeneral = "cant_kick_from_general"
|
||||
case CantKickFromLastChannel = "cant_kick_from_last_channel"
|
||||
case CantKickSelf = "cant_kick_self"
|
||||
case CantLeaveGeneral = "cant_leave_general"
|
||||
case CantLeaveLastChannel = "cant_leave_last_channel"
|
||||
case CantUpdateMessage = "cant_update_message"
|
||||
case ChannelNotFound = "channel_not_found"
|
||||
case ComplianceExportsPreventDeletion = "compliance_exports_prevent_deletion"
|
||||
case EditWindowClosed = "edit_window_closed"
|
||||
case FileCommentNotFound = "file_comment_not_found"
|
||||
case FileDeleted = "file_deleted"
|
||||
case FileNotFound = "file_not_found"
|
||||
case FileNotShared = "file_not_shared"
|
||||
case GroupContainsOthers = "group_contains_others"
|
||||
case InvalidArgName = "invalid_arg_name"
|
||||
case InvalidArrayArg = "invalid_array_arg"
|
||||
case InvalidAuth = "invalid_auth"
|
||||
case InvalidChannel = "invalid_channel"
|
||||
case InvalidCharSet = "invalid_charset"
|
||||
case InvalidClientID = "invalid_client_id"
|
||||
case InvalidCode = "invalid_code"
|
||||
case InvalidFormData = "invalid_form_data"
|
||||
case InvalidName = "invalid_name"
|
||||
case InvalidPostType = "invalid_post_type"
|
||||
case InvalidPresence = "invalid_presence"
|
||||
case InvalidTS = "invalid_timestamp"
|
||||
case InvalidTSLatest = "invalid_ts_latest"
|
||||
case InvalidTSOldest = "invalid_ts_oldest"
|
||||
case IsArchived = "is_archived"
|
||||
case LastMember = "last_member"
|
||||
case LastRAChannel = "last_ra_channel"
|
||||
case MessageNotFound = "message_not_found"
|
||||
case MessageTooLong = "msg_too_long"
|
||||
case MigrationInProgress = "migration_in_progress"
|
||||
case MissingDuration = "missing_duration"
|
||||
case MissingPostType = "missing_post_type"
|
||||
case MissingScope = "missing_scope"
|
||||
case NameTaken = "name_taken"
|
||||
case NoChannel = "no_channel"
|
||||
case NoComment = "no_comment"
|
||||
case NoItemSpecified = "no_item_specified"
|
||||
case NoReaction = "no_reaction"
|
||||
case NoText = "no_text"
|
||||
case NotArchived = "not_archived"
|
||||
case NotAuthed = "not_authed"
|
||||
case NotEnoughUsers = "not_enough_users"
|
||||
case NotInChannel = "not_in_channel"
|
||||
case NotInGroup = "not_in_group"
|
||||
case NotPinned = "not_pinned"
|
||||
case NotStarred = "not_starred"
|
||||
case OverPaginationLimit = "over_pagination_limit"
|
||||
case PaidOnly = "paid_only"
|
||||
case PermissionDenied = "perimssion_denied"
|
||||
case PostingToGeneralChannelDenied = "posting_to_general_channel_denied"
|
||||
case RateLimited = "rate_limited"
|
||||
case RequestTimeout = "request_timeout"
|
||||
case RestrictedAction = "restricted_action"
|
||||
case SnoozeEndFailed = "snooze_end_failed"
|
||||
case SnoozeFailed = "snooze_failed"
|
||||
case SnoozeNotActive = "snooze_not_active"
|
||||
case TooLong = "too_long"
|
||||
case TooManyEmoji = "too_many_emoji"
|
||||
case TooManyReactions = "too_many_reactions"
|
||||
case TooManyUsers = "too_many_users"
|
||||
case UnknownError
|
||||
case UnknownType = "unknown_type"
|
||||
case UserDisabled = "user_disabled"
|
||||
case UserDoesNotOwnChannel = "user_does_not_own_channel"
|
||||
case UserIsBot = "user_is_bot"
|
||||
case UserIsRestricted = "user_is_restricted"
|
||||
case UserIsUltraRestricted = "user_is_ultra_restricted"
|
||||
case UserListNotSupplied = "user_list_not_supplied"
|
||||
case UserNotFound = "user_not_found"
|
||||
case UserNotVisible = "user_not_visible"
|
||||
// Client
|
||||
case ClientNetworkError
|
||||
case ClientJSONError
|
||||
case ClientOAuthError
|
||||
// HTTP
|
||||
case TooManyRequests
|
||||
case UnknownHTTPError
|
||||
}
|
||||
@@ -1,769 +0,0 @@
|
||||
//
|
||||
// WebAPI.swift
|
||||
//
|
||||
// Copyright © 2016 Peter Zignego. All rights reserved.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
import Foundation
|
||||
|
||||
internal enum Endpoint: String {
|
||||
|
||||
case APITest = "api.test"
|
||||
case AuthRevoke = "auth.revoke"
|
||||
case AuthTest = "auth.test"
|
||||
case ChannelsHistory = "channels.history"
|
||||
case ChannelsInfo = "channels.info"
|
||||
case ChannelsList = "channels.list"
|
||||
case ChannelsMark = "channels.mark"
|
||||
case ChannelsSetPurpose = "channels.setPurpose"
|
||||
case ChannelsSetTopic = "channels.setTopic"
|
||||
case ChatDelete = "chat.delete"
|
||||
case ChatPostMessage = "chat.postMessage"
|
||||
case ChatUpdate = "chat.update"
|
||||
case DNDInfo = "dnd.info"
|
||||
case DNDTeamInfo = "dnd.teamInfo"
|
||||
case EmojiList = "emoji.list"
|
||||
case FilesCommentsAdd = "files.comments.add"
|
||||
case FilesCommentsEdit = "files.comments.edit"
|
||||
case FilesCommentsDelete = "files.comments.delete"
|
||||
case FilesDelete = "files.delete"
|
||||
case FilesInfo = "files.info"
|
||||
case FilesUpload = "files.upload"
|
||||
case GroupsClose = "groups.close"
|
||||
case GroupsHistory = "groups.history"
|
||||
case GroupsInfo = "groups.info"
|
||||
case GroupsList = "groups.list"
|
||||
case GroupsMark = "groups.mark"
|
||||
case GroupsOpen = "groups.open"
|
||||
case GroupsSetPurpose = "groups.setPurpose"
|
||||
case GroupsSetTopic = "groups.setTopic"
|
||||
case IMClose = "im.close"
|
||||
case IMHistory = "im.history"
|
||||
case IMList = "im.list"
|
||||
case IMMark = "im.mark"
|
||||
case IMOpen = "im.open"
|
||||
case MPIMClose = "mpim.close"
|
||||
case MPIMHistory = "mpim.history"
|
||||
case MPIMList = "mpim.list"
|
||||
case MPIMMark = "mpim.mark"
|
||||
case MPIMOpen = "mpim.open"
|
||||
case OAuthAccess = "oauth.access"
|
||||
case PinsAdd = "pins.add"
|
||||
case PinsRemove = "pins.remove"
|
||||
case ReactionsAdd = "reactions.add"
|
||||
case ReactionsGet = "reactions.get"
|
||||
case ReactionsList = "reactions.list"
|
||||
case ReactionsRemove = "reactions.remove"
|
||||
case RTMStart = "rtm.start"
|
||||
case StarsAdd = "stars.add"
|
||||
case StarsRemove = "stars.remove"
|
||||
case TeamInfo = "team.info"
|
||||
case UsersGetPresence = "users.getPresence"
|
||||
case UsersInfo = "users.info"
|
||||
case UsersList = "users.list"
|
||||
case UsersSetActive = "users.setActive"
|
||||
case UsersSetPresence = "users.setPresence"
|
||||
}
|
||||
|
||||
public final class WebAPI {
|
||||
|
||||
public typealias FailureClosure = (_ error: SlackError)->Void
|
||||
|
||||
public enum InfoType: String {
|
||||
case Purpose = "purpose"
|
||||
case Topic = "topic"
|
||||
}
|
||||
|
||||
public enum ParseMode: String {
|
||||
case Full = "full"
|
||||
case None = "none"
|
||||
}
|
||||
|
||||
public enum Presence: String {
|
||||
case Auto = "auto"
|
||||
case Away = "away"
|
||||
}
|
||||
|
||||
fileprivate enum ChannelType: String {
|
||||
case Channel = "channel"
|
||||
case Group = "group"
|
||||
case IM = "im"
|
||||
}
|
||||
|
||||
fileprivate let networkInterface: NetworkInterface
|
||||
fileprivate let token: String
|
||||
|
||||
public init(token: String) {
|
||||
self.networkInterface = NetworkInterface()
|
||||
self.token = token
|
||||
}
|
||||
|
||||
//MARK: - RTM
|
||||
public func rtmStart(_ simpleLatest: Bool? = nil, noUnreads: Bool? = nil, mpimAware: Bool? = nil, success: ((_ response: [String: Any])->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["simple_latest": simpleLatest, "no_unreads": noUnreads, "mpim_aware": mpimAware]
|
||||
networkInterface.request(.RTMStart, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(response)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Auth
|
||||
public func authenticationTest(_ success: ((_ authenticated: Bool)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.AuthTest, token: token, parameters: nil, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public static func oauthAccess(_ clientID: String, clientSecret: String, code: String, redirectURI: String? = nil, success: ((_ response: [String: Any])->Void)?, failure: ((SlackError)->Void)?) {
|
||||
let parameters: [String: Any?] = ["client_id": clientID, "client_secret": clientSecret, "code": code, "redirect_uri": redirectURI]
|
||||
NetworkInterface().request(.OAuthAccess, parameters: filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
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: Any?] = ["token": token, "test": test]
|
||||
NetworkInterface().request(.AuthRevoke, parameters: filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
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?) {
|
||||
history(.ChannelsHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
|
||||
(history) -> Void in
|
||||
success?(history)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func channelInfo(_ id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
|
||||
info(.ChannelsInfo, type:ChannelType.Channel, id: id, success: {
|
||||
(channel) -> Void in
|
||||
success?(channel)
|
||||
}) { (error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func channelsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.ChannelsList, type:ChannelType.Channel, excludeArchived: excludeArchived, success: {
|
||||
(channels) -> Void in
|
||||
success?(channels)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markChannel(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.ChannelsMark, channel: channel, timestamp: timestamp, success: {
|
||||
(ts) -> Void in
|
||||
success?(timestamp)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}) { (error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Messaging
|
||||
public func deleteMessage(_ channel: String, ts: String, success: ((_ deleted: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["channel": channel, "ts": ts]
|
||||
networkInterface.request(.ChatDelete, token: token, parameters: parameters, successClosure: { (response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
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: Any?] = ["channel": channel, "text": text.slackFormatEscaping, "as_user": asUser, "parse": parse?.rawValue, "link_names": linkNames, "unfurl_links": unfurlLinks, "unfurlMedia": unfurlMedia, "username": username, "icon_url": iconURL, "icon_emoji": iconEmoji, "attachments": encodeAttachments(attachments)]
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
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: Any?] = ["channel": channel, "ts": ts, "text": message.slackFormatEscaping, "parse": parse.rawValue, "link_names": linkNames, "attachments": encodeAttachments(attachments)]
|
||||
networkInterface.request(.ChatUpdate, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Do Not Disturb
|
||||
public func dndInfo(_ user: String? = nil, success: ((_ status: DoNotDisturbStatus)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["user": user]
|
||||
networkInterface.request(.DNDInfo, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(DoNotDisturbStatus(status: response))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func dndTeamInfo(_ users: [String]? = nil, success: ((_ statuses: [String: DoNotDisturbStatus])->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["users": users?.joined(separator: ",")]
|
||||
networkInterface.request(.DNDTeamInfo, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
guard let usersDictionary = response["users"] as? [String: Any] else {
|
||||
success?([:])
|
||||
return
|
||||
}
|
||||
success?(self.enumerateDNDStatuses(usersDictionary))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Emoji
|
||||
public func emojiList(_ success: ((_ emojiList: [String: Any]?)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.EmojiList, token: token, parameters: nil, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(response["emoji"] as? [String: Any])
|
||||
}) { (error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Files
|
||||
public func deleteFile(_ fileID: String, success: ((_ deleted: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["file": fileID]
|
||||
networkInterface.request(.FilesDelete, token: token, parameters: parameters as [String : Any]?, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func fileInfo(_ fileID: String, commentCount: Int = 100, totalPages: Int = 1, success: ((_ file: File)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["file": fileID, "count": commentCount, "totalPages": totalPages]
|
||||
networkInterface.request(.FilesInfo, token: token, parameters: parameters, successClosure: {
|
||||
(response) in
|
||||
var file = File(file: response["file"] as? [String: Any])
|
||||
(response["comments"] as? [[String: Any]])?.forEach { comment in
|
||||
let comment = Comment(comment: comment)
|
||||
if let id = comment.id {
|
||||
file.comments[id] = comment
|
||||
}
|
||||
}
|
||||
success?(file)
|
||||
}) {(error) in
|
||||
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: Any?] = ["file": file, "filename": filename, "filetype": filetype, "title": title, "initial_comment": initialComment, "channels": channels?.joined(separator: ",")]
|
||||
networkInterface.uploadRequest(token, data: file, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(File(file: response["file"] as? [String: Any]))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - File Comments
|
||||
public func addFileComment(_ fileID: String, comment: String, success: ((_ comment: Comment)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["file": fileID, "comment": comment.slackFormatEscaping]
|
||||
networkInterface.request(.FilesCommentsAdd, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(Comment(comment: response["comment"] as? [String: Any]))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func editFileComment(_ fileID: String, commentID: String, comment: String, success: ((_ comment: Comment)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["file": fileID, "id": commentID, "comment": comment.slackFormatEscaping]
|
||||
networkInterface.request(.FilesCommentsEdit, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(Comment(comment: response["comment"] as? [String: Any]))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func deleteFileComment(_ fileID: String, commentID: String, success: ((_ deleted: Bool?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["file": fileID, "id": commentID]
|
||||
networkInterface.request(.FilesCommentsDelete, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Groups
|
||||
public func closeGroup(_ groupID: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
close(.GroupsClose, channelID: groupID, success: {
|
||||
(closed) -> Void in
|
||||
success?(closed)
|
||||
}) {(error) -> Void in
|
||||
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?) {
|
||||
history(.GroupsHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
|
||||
(history) -> Void in
|
||||
success?(history)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func groupInfo(_ id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
|
||||
info(.GroupsInfo, type:ChannelType.Group, id: id, success: {
|
||||
(channel) -> Void in
|
||||
success?(channel)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func groupsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.GroupsList, type:ChannelType.Group, excludeArchived: excludeArchived, success: {
|
||||
(channels) -> Void in
|
||||
success?(channels)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markGroup(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.GroupsMark, channel: channel, timestamp: timestamp, success: {
|
||||
(ts) -> Void in
|
||||
success?(timestamp)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func openGroup(_ channel: String, success: ((_ opened: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["channel":channel]
|
||||
networkInterface.request(.GroupsOpen, token: token, parameters: parameters as [String: Any]?, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - IM
|
||||
public func closeIM(_ channel: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
close(.IMClose, channelID: channel, success: {
|
||||
(closed) -> Void in
|
||||
success?(closed)
|
||||
}) {(error) -> Void in
|
||||
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?) {
|
||||
history(.IMHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
|
||||
(history) -> Void in
|
||||
success?(history)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func imsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.IMList, type:ChannelType.IM, excludeArchived: excludeArchived, success: {
|
||||
(channels) -> Void in
|
||||
success?(channels)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markIM(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.IMMark, channel: channel, timestamp: timestamp, success: {
|
||||
(ts) -> Void in
|
||||
success?(timestamp)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func openIM(_ userID: String, success: ((_ imID: String?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["user": userID]
|
||||
networkInterface.request(.IMOpen, token: token, parameters: parameters as [String: Any]?, successClosure: {
|
||||
(response) -> Void in
|
||||
let group = response["channel"] as? [String: Any]
|
||||
success?(group?["id"] as? String)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - MPIM
|
||||
public func closeMPIM(_ channel: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
close(.MPIMClose, channelID: channel, success: {
|
||||
(closed) -> Void in
|
||||
success?(closed)
|
||||
}) {(error) -> Void in
|
||||
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?) {
|
||||
history(.MPIMHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {
|
||||
(history) -> Void in
|
||||
success?(history)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func mpimsList(_ excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.MPIMList, type:ChannelType.Group, excludeArchived: excludeArchived, success: {
|
||||
(channels) -> Void in
|
||||
success?(channels)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markMPIM(_ channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.MPIMMark, channel: channel, timestamp: timestamp, success: {
|
||||
(ts) -> Void in
|
||||
success?(timestamp)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func openMPIM(_ userIDs: [String], success: ((_ mpimID: String?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["users": userIDs.joined(separator: ",")]
|
||||
networkInterface.request(.MPIMOpen, token: token, parameters: parameters as [String: Any]?, successClosure: {
|
||||
(response) -> Void in
|
||||
let group = response["group"] as? [String: Any]
|
||||
success?(group?["id"] as? String)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Pins
|
||||
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?(ok)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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?(ok)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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: Any?] = ["channel": channel, "file": file, "file_comment": fileComment, "timestamp": timestamp]
|
||||
networkInterface.request(endpoint, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}){(error) -> Void in
|
||||
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?) {
|
||||
react(.ReactionsAdd, name: name, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
|
||||
(ok) -> Void in
|
||||
success?(ok)
|
||||
}) {(error) -> Void in
|
||||
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?) {
|
||||
react(.ReactionsRemove, name: name, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
|
||||
(ok) -> Void in
|
||||
success?(ok)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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: Any?] = ["name": name, "file": file, "file_comment": fileComment, "channel": channel, "timestamp": timestamp]
|
||||
networkInterface.request(endpoint, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
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?) {
|
||||
star(.StarsAdd, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
|
||||
(ok) -> Void in
|
||||
success?(ok)
|
||||
}) {(error) -> Void in
|
||||
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?) {
|
||||
star(.StarsRemove, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {
|
||||
(ok) -> Void in
|
||||
success?(ok)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func star(_ endpoint: Endpoint, file: String?, fileComment: String?, channel: String?, timestamp: String?, success: ((_ ok: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["file": file, "file_comment": fileComment, "channel": channel, "timestamp": timestamp]
|
||||
networkInterface.request(endpoint, token: token, parameters: WebAPI.filterNilParameters(parameters), successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Team
|
||||
public func teamInfo(_ success: ((_ info: [String: Any]?)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.TeamInfo, token: token, parameters: nil, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(response["team"] as? [String: Any])
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Users
|
||||
public func userPresence(_ user: String, success: ((_ presence: String?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["user": user]
|
||||
networkInterface.request(.UsersGetPresence, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(response["presence"] as? String)
|
||||
}){(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func userInfo(_ id: String, success: ((_ user: User)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["user": id]
|
||||
networkInterface.request(.UsersInfo, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(User(user: response["user"] as? [String: Any]))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func usersList(_ includePresence: Bool = false, success: ((_ userList: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["presence": includePresence]
|
||||
networkInterface.request(.UsersList, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(response["members"] as? [[String: Any]])
|
||||
}){(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setUserActive(_ success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.UsersSetActive, token: token, parameters: nil, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setUserPresence(_ presence: Presence, success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["presence": presence.rawValue]
|
||||
networkInterface.request(.UsersSetPresence, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Channel Utilities
|
||||
fileprivate func close(_ endpoint: Endpoint, channelID: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["channel": channelID]
|
||||
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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: Any] = ["channel": id, "latest": latest, "oldest": oldest, "inclusive": inclusive, "count": count, "unreads": unreads]
|
||||
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(History(history: response))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func info(_ endpoint: Endpoint, type: ChannelType, id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["channel": id]
|
||||
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(Channel(channel: response[type.rawValue] as? [String: Any]))
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func list(_ endpoint: Endpoint, type: ChannelType, excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["exclude_archived": excludeArchived]
|
||||
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(response[type.rawValue+"s"] as? [[String: Any]])
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func mark(_ endpoint: Endpoint, channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["channel": channel, "ts": timestamp]
|
||||
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(timestamp)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func setInfo(_ endpoint: Endpoint, type: InfoType, channel: String, text: String, success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["channel": channel, type.rawValue: text]
|
||||
networkInterface.request(endpoint, token: token, parameters: parameters, successClosure: {
|
||||
(response) -> Void in
|
||||
success?(true)
|
||||
}) {(error) -> Void in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Encode Attachments
|
||||
fileprivate func encodeAttachments(_ attachments: [Attachment?]?) -> String? {
|
||||
if let attachments = attachments {
|
||||
var attachmentArray: [[String: Any]] = []
|
||||
for attachment in attachments {
|
||||
if let attachment = attachment {
|
||||
attachmentArray.append(attachment.dictionary)
|
||||
}
|
||||
}
|
||||
do {
|
||||
let data = try JSONSerialization.data(withJSONObject: attachmentArray, options: [])
|
||||
return String(data: data, encoding: String.Encoding.utf8)
|
||||
} catch _ {
|
||||
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//MARK: - Filter Nil Parameters
|
||||
internal static func filterNilParameters(_ parameters: [String: Any?]) -> [String: Any] {
|
||||
var finalParameters = [String: Any]()
|
||||
for (key, value) in parameters {
|
||||
if let unwrapped = value {
|
||||
finalParameters[key] = unwrapped
|
||||
}
|
||||
}
|
||||
return finalParameters
|
||||
}
|
||||
|
||||
//MARK: - Enumerate Do Not Disturb Status
|
||||
fileprivate func enumerateDNDStatuses(_ statuses: [String: Any]) -> [String: DoNotDisturbStatus] {
|
||||
var retVal = [String: DoNotDisturbStatus]()
|
||||
for key in statuses.keys {
|
||||
retVal[key] = DoNotDisturbStatus(status: statuses[key] as? [String: Any])
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
}
|
||||
+66
-66
@@ -23,139 +23,139 @@
|
||||
|
||||
internal extension Client {
|
||||
|
||||
func dispatch(_ event: [String: Any]) {
|
||||
let event = Event(event: event)
|
||||
guard let type = event.type else {
|
||||
return
|
||||
}
|
||||
func dispatch(_ anEvent: [String: Any]) {
|
||||
let event = Event(anEvent)
|
||||
let type = event.type ?? .unknown
|
||||
switch type {
|
||||
case .Hello:
|
||||
case .hello:
|
||||
connected = true
|
||||
connectionEventsDelegate?.connected(self)
|
||||
case .Ok:
|
||||
case .ok:
|
||||
messageSent(event)
|
||||
case .Message:
|
||||
case .message:
|
||||
if (event.subtype != nil) {
|
||||
messageDispatcher(event)
|
||||
} else {
|
||||
messageReceived(event)
|
||||
}
|
||||
case .UserTyping:
|
||||
case .userTyping:
|
||||
userTyping(event)
|
||||
case .ChannelMarked, .IMMarked, .GroupMarked:
|
||||
case .channelMarked, .imMarked, .groupMarked:
|
||||
channelMarked(event)
|
||||
case .ChannelCreated, .IMCreated:
|
||||
case .channelCreated, .imCreated:
|
||||
channelCreated(event)
|
||||
case .ChannelJoined, .GroupJoined:
|
||||
case .channelJoined, .groupJoined:
|
||||
channelJoined(event)
|
||||
case .ChannelLeft, .GroupLeft:
|
||||
case .channelLeft, .groupLeft:
|
||||
channelLeft(event)
|
||||
case .ChannelDeleted:
|
||||
case .channelDeleted:
|
||||
channelDeleted(event)
|
||||
case .ChannelRenamed, .GroupRename:
|
||||
case .channelRenamed, .groupRename:
|
||||
channelRenamed(event)
|
||||
case .ChannelArchive, .GroupArchive:
|
||||
case .channelArchive, .groupArchive:
|
||||
channelArchived(event, archived: true)
|
||||
case .ChannelUnarchive, .GroupUnarchive:
|
||||
case .channelUnarchive, .groupUnarchive:
|
||||
channelArchived(event, archived: false)
|
||||
case .ChannelHistoryChanged, .IMHistoryChanged, .GroupHistoryChanged:
|
||||
case .channelHistoryChanged, .imHistoryChanged, .groupHistoryChanged:
|
||||
channelHistoryChanged(event)
|
||||
case .DNDUpdated:
|
||||
case .dndUpdated:
|
||||
doNotDisturbUpdated(event)
|
||||
case .DNDUpatedUser:
|
||||
case .dndUpatedUser:
|
||||
doNotDisturbUserUpdated(event)
|
||||
case .IMOpen, .GroupOpen:
|
||||
case .imOpen, .groupOpen:
|
||||
open(event, open: true)
|
||||
case .IMClose, .GroupClose:
|
||||
case .imClose, .groupClose:
|
||||
open(event, open: false)
|
||||
case .FileCreated:
|
||||
case .fileCreated:
|
||||
processFile(event)
|
||||
case .FileShared:
|
||||
case .fileShared:
|
||||
processFile(event)
|
||||
case .FileUnshared:
|
||||
case .fileUnshared:
|
||||
processFile(event)
|
||||
case .FilePublic:
|
||||
case .filePublic:
|
||||
processFile(event)
|
||||
case .FilePrivate:
|
||||
case .filePrivate:
|
||||
filePrivate(event)
|
||||
case .FileChanged:
|
||||
case .fileChanged:
|
||||
processFile(event)
|
||||
case .FileDeleted:
|
||||
case .fileDeleted:
|
||||
deleteFile(event)
|
||||
case .FileCommentAdded:
|
||||
case .fileCommentAdded:
|
||||
fileCommentAdded(event)
|
||||
case .FileCommentEdited:
|
||||
case .fileCommentEdited:
|
||||
fileCommentEdited(event)
|
||||
case .FileCommentDeleted:
|
||||
case .fileCommentDeleted:
|
||||
fileCommentDeleted(event)
|
||||
case .PinAdded:
|
||||
case .pinAdded:
|
||||
pinAdded(event)
|
||||
case .PinRemoved:
|
||||
case .pinRemoved:
|
||||
pinRemoved(event)
|
||||
case .Pong:
|
||||
case .pong:
|
||||
pong(event)
|
||||
case .PresenceChange:
|
||||
case .presenceChange:
|
||||
presenceChange(event)
|
||||
case .ManualPresenceChange:
|
||||
case .manualPresenceChange:
|
||||
manualPresenceChange(event)
|
||||
case .PrefChange:
|
||||
case .prefChange:
|
||||
changePreference(event)
|
||||
case .UserChange:
|
||||
case .userChange:
|
||||
userChange(event)
|
||||
case .TeamJoin:
|
||||
case .teamJoin:
|
||||
teamJoin(event)
|
||||
case .StarAdded:
|
||||
case .starAdded:
|
||||
itemStarred(event, star: true)
|
||||
case .StarRemoved:
|
||||
case .starRemoved:
|
||||
itemStarred(event, star: false)
|
||||
case .ReactionAdded:
|
||||
case .reactionAdded:
|
||||
addedReaction(event)
|
||||
case .ReactionRemoved:
|
||||
case .reactionRemoved:
|
||||
removedReaction(event)
|
||||
case .EmojiChanged:
|
||||
case .emojiChanged:
|
||||
emojiChanged(event)
|
||||
case .CommandsChanged:
|
||||
case .commandsChanged:
|
||||
// This functionality is only used by our web client.
|
||||
// The other APIs required to support slash command metadata are currently unstable.
|
||||
// Until they are released other clients should ignore this event.
|
||||
break
|
||||
case .TeamPlanChange:
|
||||
case .teamPlanChange:
|
||||
teamPlanChange(event)
|
||||
case .TeamPrefChange:
|
||||
case .teamPrefChange:
|
||||
teamPreferenceChange(event)
|
||||
case .TeamRename:
|
||||
case .teamRename:
|
||||
teamNameChange(event)
|
||||
case .TeamDomainChange:
|
||||
case .teamDomainChange:
|
||||
teamDomainChange(event)
|
||||
case .EmailDomainChange:
|
||||
case .emailDomainChange:
|
||||
emailDomainChange(event)
|
||||
case .TeamProfileChange:
|
||||
case .teamProfileChange:
|
||||
teamProfileChange(event)
|
||||
case .TeamProfileDelete:
|
||||
case .teamProfileDelete:
|
||||
teamProfileDeleted(event)
|
||||
case .TeamProfileReorder:
|
||||
case .teamProfileReorder:
|
||||
teamProfileReordered(event)
|
||||
case .BotAdded:
|
||||
case .botAdded:
|
||||
bot(event)
|
||||
case .BotChanged:
|
||||
case .botChanged:
|
||||
bot(event)
|
||||
case .AccountsChanged:
|
||||
case .accountsChanged:
|
||||
// The accounts_changed event is used by our web client to maintain a list of logged-in accounts.
|
||||
// Other clients should ignore this event.
|
||||
break
|
||||
case .TeamMigrationStarted:
|
||||
case .teamMigrationStarted:
|
||||
connect(options: options ?? ClientOptions())
|
||||
case .ReconnectURL:
|
||||
case .reconnectURL:
|
||||
// The reconnect_url event is currently unsupported and experimental.
|
||||
break
|
||||
case .SubteamCreated, .SubteamUpdated:
|
||||
case .subteamCreated, .subteamUpdated:
|
||||
subteam(event)
|
||||
case .SubteamSelfAdded:
|
||||
case .subteamSelfAdded:
|
||||
subteamAddedSelf(event)
|
||||
case.SubteamSelfRemoved:
|
||||
case .subteamSelfRemoved:
|
||||
subteamRemovedSelf(event)
|
||||
case .Error:
|
||||
print("Error: \(event)")
|
||||
case .error:
|
||||
print("Error: \(anEvent)")
|
||||
case .unknown:
|
||||
print("Unsupported event of type: \(anEvent["type"] ?? "No Type Information")")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,9 +164,9 @@ internal extension Client {
|
||||
return
|
||||
}
|
||||
switch subtype {
|
||||
case .MessageChanged:
|
||||
case .messageChanged:
|
||||
messageChanged(event)
|
||||
case .MessageDeleted:
|
||||
case .messageDeleted:
|
||||
messageDeleted(event)
|
||||
default:
|
||||
messageReceived(event)
|
||||
@@ -49,7 +49,7 @@ public extension Client {
|
||||
if let channel = channel {
|
||||
success(channel.0)
|
||||
} else {
|
||||
webAPI.openIM(id, success: success, failure: failure)
|
||||
webAPI.openIM(userID: id, success: success, failure: failure)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ public final class Client: WebSocketDelegate {
|
||||
}
|
||||
|
||||
internal var webSocket: WebSocket?
|
||||
fileprivate let pingPongQueue = DispatchQueue(label: "com.launchsoft.SlackKit")
|
||||
private let pingPongQueue = DispatchQueue(label: "com.launchsoft.SlackKit")
|
||||
internal var ping: Double?
|
||||
internal var pong: Double?
|
||||
internal var options: ClientOptions?
|
||||
@@ -75,7 +75,7 @@ public final class Client: WebSocketDelegate {
|
||||
|
||||
public func connect(options: ClientOptions = ClientOptions()) {
|
||||
self.options = options
|
||||
webAPI.rtmStart(options.simpleLatest, noUnreads: options.noUnreads, mpimAware: options.mpimAware, success: {(response) in
|
||||
webAPI.rtmStart(simpleLatest: options.simpleLatest, noUnreads: options.noUnreads, mpimAware: options.mpimAware, success: {(response) in
|
||||
guard let socketURL = response["url"] as? String, let url = URL(string: socketURL) else {
|
||||
return
|
||||
}
|
||||
@@ -101,7 +101,7 @@ public final class Client: WebSocketDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func format(message: String, channel: String) throws -> Data {
|
||||
private func format(message: String, channel: String) throws -> Data {
|
||||
let json: [String: Any] = [
|
||||
"id": Date().slackTimestamp,
|
||||
"type": "message",
|
||||
@@ -112,7 +112,7 @@ public final class Client: WebSocketDelegate {
|
||||
return try JSONSerialization.data(withJSONObject: json, options: [])
|
||||
}
|
||||
|
||||
fileprivate func addSentMessage(_ dictionary: [String: Any]) {
|
||||
private func addSentMessage(_ dictionary: [String: Any]) {
|
||||
var message = dictionary
|
||||
guard let id = message["id"] as? NSNumber else {
|
||||
return
|
||||
@@ -125,7 +125,7 @@ public final class Client: WebSocketDelegate {
|
||||
}
|
||||
|
||||
//MARK: - RTM Ping
|
||||
fileprivate func pingRTMServerAt(interval: TimeInterval) {
|
||||
private func pingRTMServerAt(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 {
|
||||
@@ -137,7 +137,7 @@ public final class Client: WebSocketDelegate {
|
||||
})
|
||||
}
|
||||
|
||||
fileprivate func sendRTMPing() {
|
||||
private func sendRTMPing() {
|
||||
guard connected else {
|
||||
return
|
||||
}
|
||||
@@ -154,7 +154,7 @@ public final class Client: WebSocketDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func timeoutCheck() -> Bool {
|
||||
private func timeoutCheck() -> Bool {
|
||||
if let pong = pong, let ping = ping, let timeout = options?.timeout {
|
||||
if pong - ping < timeout {
|
||||
return true
|
||||
@@ -168,7 +168,7 @@ public final class Client: WebSocketDelegate {
|
||||
}
|
||||
|
||||
//MARK: - Client setup
|
||||
fileprivate func initialSetup(JSON: [String: Any]) {
|
||||
private func initialSetup(JSON: [String: Any]) {
|
||||
team = Team(team: JSON["team"] as? [String: Any])
|
||||
authenticatedUser = User(user: JSON["self"] as? [String: Any])
|
||||
authenticatedUser?.doNotDisturbStatus = DoNotDisturbStatus(status: JSON["dnd"] as? [String: Any])
|
||||
@@ -181,28 +181,28 @@ public final class Client: WebSocketDelegate {
|
||||
enumerateSubteams(JSON["subteams"] as? [String: Any])
|
||||
}
|
||||
|
||||
fileprivate func addUser(_ aUser: [String: Any]) {
|
||||
private func addUser(_ aUser: [String: Any]) {
|
||||
let user = User(user: aUser)
|
||||
if let id = user.id {
|
||||
users[id] = user
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func addChannel(_ aChannel: [String: Any]) {
|
||||
private func addChannel(_ aChannel: [String: Any]) {
|
||||
let channel = Channel(channel: aChannel)
|
||||
if let id = channel.id {
|
||||
channels[id] = channel
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func addBot(_ aBot: [String: Any]) {
|
||||
private func addBot(_ aBot: [String: Any]) {
|
||||
let bot = Bot(bot: aBot)
|
||||
if let id = bot.id {
|
||||
bots[id] = bot
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func enumerateSubteams(_ subteams: [String: Any]?) {
|
||||
private func enumerateSubteams(_ subteams: [String: Any]?) {
|
||||
if let subteams = subteams {
|
||||
if let all = subteams["all"] as? [[String: Any]] {
|
||||
for item in all {
|
||||
@@ -222,7 +222,7 @@ public final class Client: WebSocketDelegate {
|
||||
}
|
||||
|
||||
// MARK: - Utilities
|
||||
fileprivate func enumerateObjects(_ array: [Any]?, initalizer: ([String: Any])-> Void) {
|
||||
private func enumerateObjects(_ array: [Any]?, initalizer: ([String: Any])-> Void) {
|
||||
if let array = array {
|
||||
for object in array {
|
||||
if let dictionary = object as? [String: Any] {
|
||||
@@ -39,20 +39,3 @@ internal extension String {
|
||||
return escapedString
|
||||
}
|
||||
}
|
||||
|
||||
internal extension Dictionary where Key: ExpressibleByStringLiteral, Value: Any {
|
||||
|
||||
var requestStringFromParameters: String {
|
||||
var requestString = ""
|
||||
for key in self.keys {
|
||||
if let value = self[key] as? String, let encodedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed) {
|
||||
requestString += "&\(key)=\(encodedValue)"
|
||||
} else if let value = self[key] as? Int {
|
||||
requestString += "&\(key)=\(value)"
|
||||
}
|
||||
}
|
||||
|
||||
return requestString
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public struct IncomingWebhook {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func jsonBody(_ response: [String: Any]) -> [String: Any] {
|
||||
private func jsonBody(_ response: [String: Any]) -> [String: Any] {
|
||||
var json = response
|
||||
json["channel"] = channel
|
||||
json["username"] = username
|
||||
@@ -39,7 +39,7 @@ public struct Action {
|
||||
confirm = Confirm(confirm:action?["confirm"] as? [String: Any])
|
||||
}
|
||||
|
||||
public init(name: String, text: String, style: ActionStyle = .Default, value: String? = nil, confirm: Confirm? = nil) {
|
||||
public init(name: String, text: String, style: ActionStyle = .defaultStyle, value: String? = nil, confirm: Confirm? = nil) {
|
||||
self.type = "button"
|
||||
self.name = name
|
||||
self.text = text
|
||||
@@ -92,12 +92,12 @@ public struct Action {
|
||||
}
|
||||
|
||||
public enum ActionStyle: String {
|
||||
case Default = "default"
|
||||
case Primary = "primary"
|
||||
case Danger = "danger"
|
||||
case defaultStyle = "default"
|
||||
case primary = "primary"
|
||||
case danger = "danger"
|
||||
}
|
||||
|
||||
public enum ResponseType: String {
|
||||
case InChannel = "in_channel"
|
||||
case Ephemeral = "ephemeral"
|
||||
case inChannel = "in_channel"
|
||||
case ephemeral = "ephemeral"
|
||||
}
|
||||
@@ -109,7 +109,7 @@ public struct Attachment {
|
||||
}
|
||||
|
||||
public enum AttachmentColor: String {
|
||||
case Good = "good"
|
||||
case Warning = "warning"
|
||||
case Danger = "danger"
|
||||
case good = "good"
|
||||
case warning = "warning"
|
||||
case danger = "danger"
|
||||
}
|
||||
@@ -22,109 +22,107 @@
|
||||
// THE SOFTWARE.
|
||||
|
||||
internal enum EventType: String {
|
||||
|
||||
case Hello = "hello"
|
||||
case Message = "message"
|
||||
case UserTyping = "user_typing"
|
||||
case ChannelMarked = "channel_marked"
|
||||
case ChannelCreated = "channel_created"
|
||||
case ChannelJoined = "channel_joined"
|
||||
case ChannelLeft = "channel_left"
|
||||
case ChannelDeleted = "channel_deleted"
|
||||
case ChannelRenamed = "channel_rename"
|
||||
case ChannelArchive = "channel_archive"
|
||||
case ChannelUnarchive = "channel_unarchive"
|
||||
case ChannelHistoryChanged = "channel_history_changed"
|
||||
case DNDUpdated = "dnd_updated"
|
||||
case DNDUpatedUser = "dnd_updated_user"
|
||||
case IMCreated = "im_created"
|
||||
case IMOpen = "im_open"
|
||||
case IMClose = "im_close"
|
||||
case IMMarked = "im_marked"
|
||||
case IMHistoryChanged = "im_history_changed"
|
||||
case GroupJoined = "group_joined"
|
||||
case GroupLeft = "group_left"
|
||||
case GroupOpen = "group_open"
|
||||
case GroupClose = "group_close"
|
||||
case GroupArchive = "group_archive"
|
||||
case GroupUnarchive = "group_unarchive"
|
||||
case GroupRename = "group_rename"
|
||||
case GroupMarked = "group_marked"
|
||||
case GroupHistoryChanged = "group_history_changed"
|
||||
case FileCreated = "file_created"
|
||||
case FileShared = "file_shared"
|
||||
case FileUnshared = "file_unshared"
|
||||
case FilePublic = "file_public"
|
||||
case FilePrivate = "file_private"
|
||||
case FileChanged = "file_change"
|
||||
case FileDeleted = "file_deleted"
|
||||
case FileCommentAdded = "file_comment_added"
|
||||
case FileCommentEdited = "file_comment_edited"
|
||||
case FileCommentDeleted = "file_comment_deleted"
|
||||
case PinAdded = "pin_added"
|
||||
case PinRemoved = "pin_removed"
|
||||
case Pong = "pong"
|
||||
case PresenceChange = "presence_change"
|
||||
case ManualPresenceChange = "manual_presence_change"
|
||||
case PrefChange = "pref_change"
|
||||
case UserChange = "user_change"
|
||||
case TeamJoin = "team_join"
|
||||
case StarAdded = "star_added"
|
||||
case StarRemoved = "star_removed"
|
||||
case ReactionAdded = "reaction_added"
|
||||
case ReactionRemoved = "reaction_removed"
|
||||
case EmojiChanged = "emoji_changed"
|
||||
case CommandsChanged = "commands_changed"
|
||||
case TeamPlanChange = "team_plan_change"
|
||||
case TeamPrefChange = "team_pref_change"
|
||||
case TeamRename = "team_rename"
|
||||
case TeamDomainChange = "team_domain_change"
|
||||
case EmailDomainChange = "email_domain_change"
|
||||
case TeamProfileChange = "team_profile_change"
|
||||
case TeamProfileDelete = "team_profile_delete"
|
||||
case TeamProfileReorder = "team_profile_reorder"
|
||||
case BotAdded = "bot_added"
|
||||
case BotChanged = "bot_changed"
|
||||
case AccountsChanged = "accounts_changed"
|
||||
case TeamMigrationStarted = "team_migration_started"
|
||||
case ReconnectURL = "reconnect_url"
|
||||
case SubteamCreated = "subteam_created"
|
||||
case SubteamUpdated = "subteam_updated"
|
||||
case SubteamSelfAdded = "subteam_self_added"
|
||||
case SubteamSelfRemoved = "subteam_self_removed"
|
||||
case Ok = "ok"
|
||||
case Error = "error"
|
||||
case hello = "hello"
|
||||
case message = "message"
|
||||
case userTyping = "user_typing"
|
||||
case channelMarked = "channel_marked"
|
||||
case channelCreated = "channel_created"
|
||||
case channelJoined = "channel_joined"
|
||||
case channelLeft = "channel_left"
|
||||
case channelDeleted = "channel_deleted"
|
||||
case channelRenamed = "channel_rename"
|
||||
case channelArchive = "channel_archive"
|
||||
case channelUnarchive = "channel_unarchive"
|
||||
case channelHistoryChanged = "channel_history_changed"
|
||||
case dndUpdated = "dnd_updated"
|
||||
case dndUpatedUser = "dnd_updated_user"
|
||||
case imCreated = "im_created"
|
||||
case imOpen = "im_open"
|
||||
case imClose = "im_close"
|
||||
case imMarked = "im_marked"
|
||||
case imHistoryChanged = "im_history_changed"
|
||||
case groupJoined = "group_joined"
|
||||
case groupLeft = "group_left"
|
||||
case groupOpen = "group_open"
|
||||
case groupClose = "group_close"
|
||||
case groupArchive = "group_archive"
|
||||
case groupUnarchive = "group_unarchive"
|
||||
case groupRename = "group_rename"
|
||||
case groupMarked = "group_marked"
|
||||
case groupHistoryChanged = "group_history_changed"
|
||||
case fileCreated = "file_created"
|
||||
case fileShared = "file_shared"
|
||||
case fileUnshared = "file_unshared"
|
||||
case filePublic = "file_public"
|
||||
case filePrivate = "file_private"
|
||||
case fileChanged = "file_change"
|
||||
case fileDeleted = "file_deleted"
|
||||
case fileCommentAdded = "file_comment_added"
|
||||
case fileCommentEdited = "file_comment_edited"
|
||||
case fileCommentDeleted = "file_comment_deleted"
|
||||
case pinAdded = "pin_added"
|
||||
case pinRemoved = "pin_removed"
|
||||
case pong = "pong"
|
||||
case presenceChange = "presence_change"
|
||||
case manualPresenceChange = "manual_presence_change"
|
||||
case prefChange = "pref_change"
|
||||
case userChange = "user_change"
|
||||
case teamJoin = "team_join"
|
||||
case starAdded = "star_added"
|
||||
case starRemoved = "star_removed"
|
||||
case reactionAdded = "reaction_added"
|
||||
case reactionRemoved = "reaction_removed"
|
||||
case emojiChanged = "emoji_changed"
|
||||
case commandsChanged = "commands_changed"
|
||||
case teamPlanChange = "team_plan_change"
|
||||
case teamPrefChange = "team_pref_change"
|
||||
case teamRename = "team_rename"
|
||||
case teamDomainChange = "team_domain_change"
|
||||
case emailDomainChange = "email_domain_change"
|
||||
case teamProfileChange = "team_profile_change"
|
||||
case teamProfileDelete = "team_profile_delete"
|
||||
case teamProfileReorder = "team_profile_reorder"
|
||||
case botAdded = "bot_added"
|
||||
case botChanged = "bot_changed"
|
||||
case accountsChanged = "accounts_changed"
|
||||
case teamMigrationStarted = "team_migration_started"
|
||||
case reconnectURL = "reconnect_url"
|
||||
case subteamCreated = "subteam_created"
|
||||
case subteamUpdated = "subteam_updated"
|
||||
case subteamSelfAdded = "subteam_self_added"
|
||||
case subteamSelfRemoved = "subteam_self_removed"
|
||||
case ok = "ok"
|
||||
case error = "error"
|
||||
case unknown = "unknown"
|
||||
}
|
||||
|
||||
internal enum MessageSubtype: String {
|
||||
|
||||
case BotMessage = "bot_message"
|
||||
case MeMessage = "me_message"
|
||||
case MessageChanged = "message_changed"
|
||||
case MessageDeleted = "message_deleted"
|
||||
case ChannelJoin = "channel_join"
|
||||
case ChannelLeave = "channel_leave"
|
||||
case ChannelTopic = "channel_topic"
|
||||
case ChannelPurpose = "channel_purpose"
|
||||
case ChannelName = "channel_name"
|
||||
case ChannelArchive = "channel_archive"
|
||||
case ChannelUnarchive = "channel_unarchive"
|
||||
case GroupJoin = "group_join"
|
||||
case GroupLeave = "group_leave"
|
||||
case GroupTopic = "group_topic"
|
||||
case GroupPurpose = "group_purpose"
|
||||
case GroupName = "group_name"
|
||||
case GroupArchive = "group_archive"
|
||||
case GroupUnarchive = "group_unarchive"
|
||||
case FileShare = "file_share"
|
||||
case FileComment = "file_comment"
|
||||
case FileMention = "file_mention"
|
||||
case PinnedItem = "pinned_item"
|
||||
case UnpinnedItem = "unpinned_item"
|
||||
case botMessage = "bot_message"
|
||||
case meMessage = "me_message"
|
||||
case messageChanged = "message_changed"
|
||||
case messageDeleted = "message_deleted"
|
||||
case channelJoin = "channel_join"
|
||||
case channelLeave = "channel_leave"
|
||||
case channelTopic = "channel_topic"
|
||||
case channelPurpose = "channel_purpose"
|
||||
case channelName = "channel_name"
|
||||
case channelArchive = "channel_archive"
|
||||
case channelUnarchive = "channel_unarchive"
|
||||
case groupJoin = "group_join"
|
||||
case groupLeave = "group_leave"
|
||||
case groupTopic = "group_topic"
|
||||
case groupPurpose = "group_purpose"
|
||||
case groupName = "group_name"
|
||||
case groupArchive = "group_archive"
|
||||
case groupUnarchive = "group_unarchive"
|
||||
case fileShare = "file_share"
|
||||
case fileComment = "file_comment"
|
||||
case fileMention = "file_mention"
|
||||
case pinnedItem = "pinned_item"
|
||||
case unpinnedItem = "unpinned_item"
|
||||
}
|
||||
|
||||
internal struct Event {
|
||||
|
||||
internal class Event {
|
||||
let type: EventType?
|
||||
let ts: String?
|
||||
let subtype: String?
|
||||
@@ -162,7 +160,7 @@ internal struct Event {
|
||||
let subteamID: String?
|
||||
var profile: CustomProfile?
|
||||
|
||||
init(event:[String: Any]) {
|
||||
init(_ event:[String: Any]) {
|
||||
type = EventType(rawValue: event["type"] as? String ?? "ok")
|
||||
ts = event["ts"] as? String
|
||||
subtype = event["subtype"] as? String
|
||||
@@ -0,0 +1,121 @@
|
||||
//
|
||||
// SlackError.swift
|
||||
//
|
||||
// Copyright © 2016 Peter Zignego. All rights reserved.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
public enum SlackError: String, Error {
|
||||
case accountInactive = "account_inactive"
|
||||
case alreadyArchived = "already_archived"
|
||||
case alreadyInChannel = "already_in_channel"
|
||||
case alreadyPinned = "already_pinned"
|
||||
case alreadyReacted = "already_reacted"
|
||||
case alreadyStarred = "already_starred"
|
||||
case badClientSecret = "bad_client_secret"
|
||||
case badRedirectURI = "bad_redirect_uri"
|
||||
case badTimeStamp = "bad_timestamp"
|
||||
case cantArchiveGeneral = "cant_archive_general"
|
||||
case cantDelete = "cant_delete"
|
||||
case cantDeleteFile = "cant_delete_file"
|
||||
case cantDeleteMessage = "cant_delete_message"
|
||||
case cantInvite = "cant_invite"
|
||||
case cantInviteSelf = "cant_invite_self"
|
||||
case cantKickFromGeneral = "cant_kick_from_general"
|
||||
case cantKickFromLastChannel = "cant_kick_from_last_channel"
|
||||
case cantKickSelf = "cant_kick_self"
|
||||
case cantLeaveGeneral = "cant_leave_general"
|
||||
case cantLeaveLastChannel = "cant_leave_last_channel"
|
||||
case cantUpdateMessage = "cant_update_message"
|
||||
case channelNotFound = "channel_not_found"
|
||||
case complianceExportsPreventDeletion = "compliance_exports_prevent_deletion"
|
||||
case editWindowClosed = "edit_window_closed"
|
||||
case fileCommentNotFound = "file_comment_not_found"
|
||||
case fileDeleted = "file_deleted"
|
||||
case fileNotFound = "file_not_found"
|
||||
case fileNotShared = "file_not_shared"
|
||||
case groupContainsOthers = "group_contains_others"
|
||||
case invalidArgName = "invalid_arg_name"
|
||||
case invalidArrayArg = "invalid_array_arg"
|
||||
case invalidAuth = "invalid_auth"
|
||||
case invalidChannel = "invalid_channel"
|
||||
case invalidCharSet = "invalid_charset"
|
||||
case invalidClientID = "invalid_client_id"
|
||||
case invalidCode = "invalid_code"
|
||||
case invalidFormData = "invalid_form_data"
|
||||
case invalidName = "invalid_name"
|
||||
case invalidPostType = "invalid_post_type"
|
||||
case invalidPresence = "invalid_presence"
|
||||
case invalidTS = "invalid_timestamp"
|
||||
case invalidTSLatest = "invalid_ts_latest"
|
||||
case invalidTSOldest = "invalid_ts_oldest"
|
||||
case isArchived = "is_archived"
|
||||
case lastMember = "last_member"
|
||||
case lastRAChannel = "last_ra_channel"
|
||||
case messageNotFound = "message_not_found"
|
||||
case messageTooLong = "msg_too_long"
|
||||
case migrationInProgress = "migration_in_progress"
|
||||
case missingDuration = "missing_duration"
|
||||
case missingPostType = "missing_post_type"
|
||||
case missingScope = "missing_scope"
|
||||
case nameTaken = "name_taken"
|
||||
case noChannel = "no_channel"
|
||||
case noComment = "no_comment"
|
||||
case noItemSpecified = "no_item_specified"
|
||||
case noReaction = "no_reaction"
|
||||
case noText = "no_text"
|
||||
case notArchived = "not_archived"
|
||||
case notAuthed = "not_authed"
|
||||
case notEnoughUsers = "not_enough_users"
|
||||
case notInChannel = "not_in_channel"
|
||||
case notInGroup = "not_in_group"
|
||||
case notPinned = "not_pinned"
|
||||
case notStarred = "not_starred"
|
||||
case overPaginationLimit = "over_pagination_limit"
|
||||
case paidOnly = "paid_only"
|
||||
case permissionDenied = "perimssion_denied"
|
||||
case postingToGeneralChannelDenied = "posting_to_general_channel_denied"
|
||||
case rateLimited = "rate_limited"
|
||||
case requestTimeout = "request_timeout"
|
||||
case restrictedAction = "restricted_action"
|
||||
case snoozeEndFailed = "snooze_end_failed"
|
||||
case snoozeFailed = "snooze_failed"
|
||||
case snoozeNotActive = "snooze_not_active"
|
||||
case tooLong = "too_long"
|
||||
case tooManyEmoji = "too_many_emoji"
|
||||
case tooManyReactions = "too_many_reactions"
|
||||
case tooManyUsers = "too_many_users"
|
||||
case unknownError
|
||||
case unknownType = "unknown_type"
|
||||
case userDisabled = "user_disabled"
|
||||
case userDoesNotOwnChannel = "user_does_not_own_channel"
|
||||
case userIsBot = "user_is_bot"
|
||||
case userIsRestricted = "user_is_restricted"
|
||||
case userIsUltraRestricted = "user_is_ultra_restricted"
|
||||
case userListNotSupplied = "user_list_not_supplied"
|
||||
case userNotFound = "user_not_found"
|
||||
case userNotVisible = "user_not_visible"
|
||||
// Client
|
||||
case clientNetworkError
|
||||
case clientJSONError
|
||||
case clientOAuthError
|
||||
// HTTP
|
||||
case tooManyRequests
|
||||
case unknownHTTPError
|
||||
}
|
||||
@@ -27,33 +27,29 @@ internal struct NetworkInterface {
|
||||
|
||||
private let apiUrl = "https://slack.com/api/"
|
||||
|
||||
internal func request(_ endpoint: Endpoint, token: String? = nil, parameters: [String: Any]?, successClosure: @escaping ([String: Any])->Void, errorClosure: @escaping (SlackError)->Void) {
|
||||
var requestString = "\(apiUrl)\(endpoint.rawValue)?"
|
||||
if let token = token {
|
||||
requestString += "token=\(token)"
|
||||
internal func request(_ endpoint: Endpoint, parameters: [String: Any?], successClosure: @escaping ([String: Any])->Void, errorClosure: @escaping (SlackError)->Void) {
|
||||
var components = URLComponents(string: "\(apiUrl)\(endpoint.rawValue)")
|
||||
if parameters.count > 0 {
|
||||
components?.queryItems = filterNilParameters(parameters).map { URLQueryItem(name: $0.0, value: "\($0.1)") }
|
||||
}
|
||||
if let params = parameters {
|
||||
requestString += params.requestStringFromParameters
|
||||
}
|
||||
guard let url = URL(string: requestString) else {
|
||||
errorClosure(SlackError.ClientNetworkError)
|
||||
guard let url = components?.url else {
|
||||
errorClosure(SlackError.clientNetworkError)
|
||||
return
|
||||
}
|
||||
let request = URLRequest(url:url)
|
||||
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)
|
||||
})
|
||||
URLSession.shared.dataTask(with: request) {(data, response, internalError) in
|
||||
do {
|
||||
successClosure(try self.handleResponse(data, response: response, internalError: internalError))
|
||||
} catch let error {
|
||||
errorClosure(error as? SlackError ?? SlackError.unknownError)
|
||||
}
|
||||
}.resume()
|
||||
}
|
||||
|
||||
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)
|
||||
errorClosure(SlackError.clientNetworkError)
|
||||
return
|
||||
}
|
||||
var request = URLRequest(url:url)
|
||||
@@ -62,23 +58,22 @@ internal struct NetworkInterface {
|
||||
request.setValue(contentType, forHTTPHeaderField: "Content-Type")
|
||||
request.httpBody = data
|
||||
|
||||
URLSession.shared.dataTask(with: request) {
|
||||
(data, response, internalError) -> Void in
|
||||
URLSession.shared.dataTask(with: request) {(data, response, internalError) in
|
||||
if internalError == nil {
|
||||
success(true)
|
||||
} else {
|
||||
errorClosure(SlackError.ClientNetworkError)
|
||||
errorClosure(SlackError.clientNetworkError)
|
||||
}
|
||||
}.resume()
|
||||
}
|
||||
|
||||
internal func uploadRequest(_ token: String, data: Data, parameters: [String: Any]?, successClosure: @escaping ([String: Any])->Void, errorClosure: @escaping (SlackError)->Void) {
|
||||
var requestString = "\(apiUrl)\(Endpoint.FilesUpload.rawValue)?token=\(token)"
|
||||
if let params = parameters {
|
||||
requestString = requestString + params.requestStringFromParameters
|
||||
internal func uploadRequest(data: Data, parameters: [String: Any?], successClosure: @escaping ([String: Any])->Void, errorClosure: @escaping (SlackError)->Void) {
|
||||
var components = URLComponents(string: "\(apiUrl)\(Endpoint.filesUpload.rawValue)")
|
||||
if parameters.count > 0 {
|
||||
components?.queryItems = filterNilParameters(parameters).map { URLQueryItem(name: $0.0, value: "\($0.1)") }
|
||||
}
|
||||
guard let url = URL(string: requestString) else {
|
||||
errorClosure(SlackError.ClientNetworkError)
|
||||
guard let url = components?.url else {
|
||||
errorClosure(SlackError.clientNetworkError)
|
||||
return
|
||||
}
|
||||
var request = URLRequest(url:url)
|
||||
@@ -87,9 +82,9 @@ internal struct NetworkInterface {
|
||||
let contentType = "multipart/form-data; boundary=" + boundaryConstant
|
||||
let boundaryStart = "--\(boundaryConstant)\r\n"
|
||||
let boundaryEnd = "--\(boundaryConstant)--\r\n"
|
||||
let contentDispositionString = "Content-Disposition: form-data; name=\"file\"; filename=\"\(parameters!["filename"])\"\r\n"
|
||||
let contentTypeString = "Content-Type: \(parameters!["filetype"])\r\n\r\n"
|
||||
|
||||
let contentDispositionString = "Content-Disposition: form-data; name=\"file\"; filename=\"\(parameters["filename"])\"\r\n"
|
||||
let contentTypeString = "Content-Type: \(parameters["filetype"])\r\n\r\n"
|
||||
|
||||
var requestBodyData: Data = Data()
|
||||
requestBodyData.append(boundaryStart.data(using: String.Encoding.utf8)!)
|
||||
requestBodyData.append(contentDispositionString.data(using: String.Encoding.utf8)!)
|
||||
@@ -100,49 +95,46 @@ internal struct NetworkInterface {
|
||||
|
||||
request.setValue(contentType, forHTTPHeaderField: "Content-Type")
|
||||
request.httpBody = requestBodyData as Data
|
||||
|
||||
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)
|
||||
})
|
||||
|
||||
URLSession.shared.dataTask(with: request) {(data, response, internalError) in
|
||||
do {
|
||||
successClosure(try self.handleResponse(data, response: response, internalError: internalError))
|
||||
} catch let error {
|
||||
errorClosure(error as? SlackError ?? SlackError.unknownError)
|
||||
}
|
||||
}.resume()
|
||||
}
|
||||
|
||||
private func handleResponse(_ data: Data?, response:URLResponse?, internalError:Error?, successClosure: ([String: Any])->Void, errorClosure: (SlackError)->Void) {
|
||||
private func handleResponse(_ data: Data?, response:URLResponse?, internalError:Error?) throws -> [String: Any] {
|
||||
guard let data = data, let response = response as? HTTPURLResponse else {
|
||||
errorClosure(SlackError.ClientNetworkError)
|
||||
return
|
||||
throw SlackError.clientNetworkError
|
||||
}
|
||||
do {
|
||||
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
|
||||
errorClosure(SlackError.ClientJSONError)
|
||||
return
|
||||
throw SlackError.clientJSONError
|
||||
}
|
||||
|
||||
switch response.statusCode {
|
||||
case 200:
|
||||
if (json["ok"] as! Bool == true) {
|
||||
successClosure(json)
|
||||
return json
|
||||
} else {
|
||||
if let errorString = json["error"] as? String {
|
||||
throw SlackError(rawValue: errorString) ?? .UnknownError
|
||||
throw SlackError(rawValue: errorString) ?? .unknownError
|
||||
} else {
|
||||
throw SlackError.UnknownError
|
||||
throw SlackError.unknownError
|
||||
}
|
||||
}
|
||||
case 429:
|
||||
throw SlackError.TooManyRequests
|
||||
throw SlackError.tooManyRequests
|
||||
default:
|
||||
throw SlackError.ClientNetworkError
|
||||
throw SlackError.clientNetworkError
|
||||
}
|
||||
} catch let error {
|
||||
if let slackError = error as? SlackError {
|
||||
errorClosure(slackError)
|
||||
throw slackError
|
||||
} else {
|
||||
errorClosure(SlackError.UnknownError)
|
||||
throw SlackError.unknownError
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -150,4 +142,15 @@ internal struct NetworkInterface {
|
||||
private func randomBoundary() -> String {
|
||||
return String(format: "slackkit.boundary.%08x%08x", arc4random(), arc4random())
|
||||
}
|
||||
|
||||
//MARK: - Filter Nil Parameters
|
||||
private func filterNilParameters(_ parameters: [String: Any?]) -> [String: Any] {
|
||||
var finalParameters = [String: Any]()
|
||||
for (key, value) in parameters {
|
||||
if let unwrapped = value {
|
||||
finalParameters[key] = unwrapped
|
||||
}
|
||||
}
|
||||
return finalParameters
|
||||
}
|
||||
}
|
||||
@@ -30,14 +30,14 @@ internal protocol OAuthDelegate {
|
||||
|
||||
public struct OAuthServer {
|
||||
|
||||
fileprivate let oauthURL = "https://slack.com/oauth/authorize"
|
||||
|
||||
fileprivate let http = HttpServer()
|
||||
fileprivate let clientID: String
|
||||
fileprivate let clientSecret: String
|
||||
fileprivate let state: String?
|
||||
fileprivate let redirectURI: String?
|
||||
fileprivate var delegate: OAuthDelegate?
|
||||
private 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?
|
||||
|
||||
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,12 +61,12 @@ public struct OAuthServer {
|
||||
http.stop()
|
||||
}
|
||||
|
||||
fileprivate func oauthRoute() {
|
||||
private func oauthRoute() {
|
||||
http["/oauth"] = { request in
|
||||
guard let response = AuthorizeResponse(queryParameters: request.queryParams), response.state == self.state else {
|
||||
return .badRequest(.text("Bad request."))
|
||||
}
|
||||
WebAPI.oauthAccess(self.clientID, clientSecret: self.clientSecret, code: response.code, redirectURI: self.redirectURI, success: {(response) in
|
||||
WebAPI.oauthAccess(clientID: self.clientID, clientSecret: self.clientSecret, code: response.code, redirectURI: self.redirectURI, success: {(response) in
|
||||
self.delegate?.userAuthed(OAuthResponse(response: response))
|
||||
}, failure: {(error) in
|
||||
print("Authorization failed")
|
||||
@@ -78,13 +78,13 @@ public struct OAuthServer {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func oauthURLRequest(_ authorize: AuthorizeRequest) -> URLRequest? {
|
||||
var requestString = "\(oauthURL)?client_id=\(authorize.clientID)"
|
||||
requestString += authorize.parameters.requestStringFromParameters
|
||||
guard let url = URL(string: requestString) else {
|
||||
private func oauthURLRequest(_ authorize: AuthorizeRequest) -> URLRequest? {
|
||||
var components = URLComponents(string: "\(oauthURL)")
|
||||
components?.queryItems = [URLQueryItem(name: "client_id", value: "\(authorize.clientID)")]
|
||||
guard let url = components?.url else {
|
||||
return nil
|
||||
}
|
||||
return URLRequest(url:url)
|
||||
return URLRequest(url: url)
|
||||
}
|
||||
|
||||
public func authorizeRequest(_ scope:[Scope], redirectURI: String, state: String = "slackkit", team: String? = nil) -> URLRequest? {
|
||||
@@ -27,7 +27,7 @@ public final class SlackKit: OAuthDelegate {
|
||||
|
||||
internal(set) public var oauth: OAuthServer?
|
||||
internal(set) public var clients: [String: Client] = [:]
|
||||
fileprivate let clientOptions: ClientOptions
|
||||
private let clientOptions: ClientOptions
|
||||
// Initalization block
|
||||
public var onClientInitalization: ((Client) -> Void)?
|
||||
|
||||
@@ -0,0 +1,707 @@
|
||||
//
|
||||
// WebAPI.swift
|
||||
//
|
||||
// Copyright © 2016 Peter Zignego. All rights reserved.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
import Foundation
|
||||
|
||||
internal enum Endpoint: String {
|
||||
case apiTest = "api.test"
|
||||
case authRevoke = "auth.revoke"
|
||||
case authTest = "auth.test"
|
||||
case channelsHistory = "channels.history"
|
||||
case channelsInfo = "channels.info"
|
||||
case channelsList = "channels.list"
|
||||
case channelsMark = "channels.mark"
|
||||
case channelsSetPurpose = "channels.setPurpose"
|
||||
case channelsSetTopic = "channels.setTopic"
|
||||
case chatDelete = "chat.delete"
|
||||
case chatPostMessage = "chat.postMessage"
|
||||
case chatMeMessage = "chat.meMessage"
|
||||
case chatUpdate = "chat.update"
|
||||
case dndInfo = "dnd.info"
|
||||
case dndTeamInfo = "dnd.teamInfo"
|
||||
case emojiList = "emoji.list"
|
||||
case filesCommentsAdd = "files.comments.add"
|
||||
case filesCommentsEdit = "files.comments.edit"
|
||||
case filesCommentsDelete = "files.comments.delete"
|
||||
case filesDelete = "files.delete"
|
||||
case filesInfo = "files.info"
|
||||
case filesUpload = "files.upload"
|
||||
case groupsClose = "groups.close"
|
||||
case groupsHistory = "groups.history"
|
||||
case groupsInfo = "groups.info"
|
||||
case groupsList = "groups.list"
|
||||
case groupsMark = "groups.mark"
|
||||
case groupsOpen = "groups.open"
|
||||
case groupsSetPurpose = "groups.setPurpose"
|
||||
case groupsSetTopic = "groups.setTopic"
|
||||
case imClose = "im.close"
|
||||
case imHistory = "im.history"
|
||||
case imList = "im.list"
|
||||
case imMark = "im.mark"
|
||||
case imOpen = "im.open"
|
||||
case mpimClose = "mpim.close"
|
||||
case mpimHistory = "mpim.history"
|
||||
case mpimList = "mpim.list"
|
||||
case mpimMark = "mpim.mark"
|
||||
case mpimOpen = "mpim.open"
|
||||
case oauthAccess = "oauth.access"
|
||||
case pinsAdd = "pins.add"
|
||||
case pinsRemove = "pins.remove"
|
||||
case reactionsAdd = "reactions.add"
|
||||
case reactionsGet = "reactions.get"
|
||||
case reactionsList = "reactions.list"
|
||||
case reactionsRemove = "reactions.remove"
|
||||
case rtmStart = "rtm.start"
|
||||
case starsAdd = "stars.add"
|
||||
case starsRemove = "stars.remove"
|
||||
case teamInfo = "team.info"
|
||||
case usersGetPresence = "users.getPresence"
|
||||
case usersInfo = "users.info"
|
||||
case usersList = "users.list"
|
||||
case usersSetActive = "users.setActive"
|
||||
case usersSetPresence = "users.setPresence"
|
||||
}
|
||||
|
||||
public final class WebAPI {
|
||||
|
||||
public typealias FailureClosure = (_ error: SlackError)->Void
|
||||
|
||||
public enum InfoType: String {
|
||||
case purpose = "purpose"
|
||||
case topic = "topic"
|
||||
}
|
||||
|
||||
public enum ParseMode: String {
|
||||
case full = "full"
|
||||
case none = "none"
|
||||
}
|
||||
|
||||
public enum Presence: String {
|
||||
case auto = "auto"
|
||||
case away = "away"
|
||||
}
|
||||
|
||||
private enum ChannelType: String {
|
||||
case channel = "channel"
|
||||
case group = "group"
|
||||
case im = "im"
|
||||
}
|
||||
|
||||
private let networkInterface: NetworkInterface
|
||||
private let token: String
|
||||
|
||||
public init(token: String) {
|
||||
self.networkInterface = NetworkInterface()
|
||||
self.token = token
|
||||
}
|
||||
|
||||
//MARK: - RTM
|
||||
public func rtmStart(simpleLatest: Bool? = nil, noUnreads: Bool? = nil, mpimAware: Bool? = nil, success: ((_ response: [String: Any])->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["token": token, "simple_latest": simpleLatest, "no_unreads": noUnreads, "mpim_aware": mpimAware]
|
||||
networkInterface.request(.rtmStart, parameters: parameters, successClosure: {(response) in
|
||||
success?(response)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Auth
|
||||
public func authenticationTest(success: ((_ authenticated: Bool)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.authTest, parameters: ["token": token], successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public static func oauthAccess(clientID: String, clientSecret: String, code: String, redirectURI: String? = nil, success: ((_ response: [String: Any])->Void)?, failure: ((SlackError)->Void)?) {
|
||||
let parameters: [String: Any?] = ["client_id": clientID, "client_secret": clientSecret, "code": code, "redirect_uri": redirectURI]
|
||||
NetworkInterface().request(.oauthAccess, parameters: parameters, successClosure: {(response) in
|
||||
success?(response)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public static func oauthRevoke(token: String, test: Bool? = nil, success: ((_ revoked:Bool)->Void)?, failure: ((SlackError)->Void)?) {
|
||||
let parameters: [String: Any?] = ["token": token, "test": test]
|
||||
NetworkInterface().request(.authRevoke, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) 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?) {
|
||||
history(.channelsHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {(history) in
|
||||
success?(history)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func channelInfo(id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
|
||||
info(.channelsInfo, type:.channel, id: id, success: {(channel) in
|
||||
success?(channel)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func channelsList(excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.channelsList, type:.channel, excludeArchived: excludeArchived, success: {(channels) in
|
||||
success?(channels)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markChannel(channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.channelsMark, channel: channel, timestamp: timestamp, success: {(ts) in
|
||||
success?(timestamp)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setChannelPurpose(channel: String, purpose: String, success: ((_ purposeSet: Bool)->Void)?, failure: FailureClosure?) {
|
||||
setInfo(.channelsSetPurpose, type: .purpose, channel: channel, text: purpose, success: {(purposeSet) in
|
||||
success?(purposeSet)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setChannelTopic(channel: String, topic: String, success: ((_ topicSet: Bool)->Void)?, failure: FailureClosure?) {
|
||||
setInfo(.channelsSetTopic, type: .topic, channel: channel, text: topic, success: {(topicSet) in
|
||||
success?(topicSet)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Messaging
|
||||
public func deleteMessage(channel: String, ts: String, success: ((_ deleted: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "channel": channel, "ts": ts]
|
||||
networkInterface.request(.chatDelete, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
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: Any?] = ["token": token, "channel": channel, "text": text.slackFormatEscaping, "as_user": asUser, "parse": parse?.rawValue, "link_names": linkNames, "unfurl_links": unfurlLinks, "unfurlMedia": unfurlMedia, "username": username, "icon_url": iconURL, "icon_emoji": iconEmoji, "attachments": encodeAttachments(attachments)]
|
||||
networkInterface.request(.chatPostMessage, parameters: parameters, successClosure: {(response) in
|
||||
success?((ts: response["ts"] as? String, response["channel"] as? String))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func sendMeMessage(channel: String, text: String, success: (((ts: String?, channel: String?))->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["token": token, "channel": channel, "text": text.slackFormatEscaping]
|
||||
networkInterface.request(.chatMeMessage, parameters: parameters, successClosure: {(response) in
|
||||
success?((ts: response["ts"] as? String, response["channel"] as? String))
|
||||
}) {(error) in
|
||||
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: Any?] = ["token": token, "channel": channel, "ts": ts, "text": message.slackFormatEscaping, "parse": parse.rawValue, "link_names": linkNames, "attachments": encodeAttachments(attachments)]
|
||||
networkInterface.request(.chatUpdate, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Do Not Disturb
|
||||
public func dndInfo(user: String? = nil, success: ((_ status: DoNotDisturbStatus)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["token": token, "user": user]
|
||||
networkInterface.request(.dndInfo, parameters: parameters, successClosure: {(response) in
|
||||
success?(DoNotDisturbStatus(status: response))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func dndTeamInfo(users: [String]? = nil, success: ((_ statuses: [String: DoNotDisturbStatus])->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["token": token, "users": users?.joined(separator: ",")]
|
||||
networkInterface.request(.dndTeamInfo, parameters: parameters, successClosure: {(response) in
|
||||
guard let usersDictionary = response["users"] as? [String: Any] else {
|
||||
success?([:])
|
||||
return
|
||||
}
|
||||
success?(self.enumerateDNDStatuses(usersDictionary))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Emoji
|
||||
public func emojiList(success: ((_ emojiList: [String: Any]?)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.emojiList, parameters: ["token": token], successClosure: {(response) in
|
||||
success?(response["emoji"] as? [String: Any])
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Files
|
||||
public func deleteFile(fileID: String, success: ((_ deleted: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["token": token, "file": fileID]
|
||||
networkInterface.request(.filesDelete, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func fileInfo(fileID: String, commentCount: Int = 100, totalPages: Int = 1, success: ((_ file: File)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "file": fileID, "count": commentCount, "totalPages": totalPages]
|
||||
networkInterface.request(.filesInfo, parameters: parameters, successClosure: {(response) in
|
||||
var file = File(file: response["file"] as? [String: Any])
|
||||
(response["comments"] as? [[String: Any]])?.forEach { comment in
|
||||
let comment = Comment(comment: comment)
|
||||
if let id = comment.id {
|
||||
file.comments[id] = comment
|
||||
}
|
||||
}
|
||||
success?(file)
|
||||
}) {(error) in
|
||||
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: Any?] = ["token": token, "filename": filename, "filetype": filetype, "title": title, "initial_comment": initialComment, "channels": channels?.joined(separator: ",")]
|
||||
networkInterface.uploadRequest(data: file, parameters: parameters, successClosure: {(response) in
|
||||
success?(File(file: response["file"] as? [String: Any]))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - File Comments
|
||||
public func addFileComment(fileID: String, comment: String, success: ((_ comment: Comment)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "file": fileID, "comment": comment.slackFormatEscaping]
|
||||
networkInterface.request(.filesCommentsAdd, parameters: parameters, successClosure: {(response) in
|
||||
success?(Comment(comment: response["comment"] as? [String: Any]))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func editFileComment(fileID: String, commentID: String, comment: String, success: ((_ comment: Comment)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "file": fileID, "id": commentID, "comment": comment.slackFormatEscaping]
|
||||
networkInterface.request(.filesCommentsEdit, parameters: parameters, successClosure: {(response) in
|
||||
success?(Comment(comment: response["comment"] as? [String: Any]))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func deleteFileComment(fileID: String, commentID: String, success: ((_ deleted: Bool?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "file": fileID, "id": commentID]
|
||||
networkInterface.request(.filesCommentsDelete, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Groups
|
||||
public func closeGroup(groupID: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
close(.groupsClose, channelID: groupID, success: {(closed) in
|
||||
success?(closed)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
history(.groupsHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {(history) in
|
||||
success?(history)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func groupInfo(id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
|
||||
info(.groupsInfo, type:.group, id: id, success: {(channel) in
|
||||
success?(channel)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func groupsList(excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.groupsList, type:.group, excludeArchived: excludeArchived, success: {(channels) in
|
||||
success?(channels)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markGroup(channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.groupsMark, channel: channel, timestamp: timestamp, success: {(ts) in
|
||||
success?(timestamp)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func openGroup(channel: String, success: ((_ opened: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["token": token, "channel":channel]
|
||||
networkInterface.request(.groupsOpen, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setGroupPurpose(channel: String, purpose: String, success: ((_ purposeSet: Bool)->Void)?, failure: FailureClosure?) {
|
||||
setInfo(.groupsSetPurpose, type: .purpose, channel: channel, text: purpose, success: {(purposeSet) in
|
||||
success?(purposeSet)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setGroupTopic(channel: String, topic: String, success: ((_ topicSet: Bool)->Void)?, failure: FailureClosure?) {
|
||||
setInfo(.groupsSetTopic, type: .topic, channel: channel, text: topic, success: {(topicSet) in
|
||||
success?(topicSet)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - IM
|
||||
public func closeIM(channel: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
close(.imClose, channelID: channel, success: {(closed) in
|
||||
success?(closed)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
history(.imHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {(history) in
|
||||
success?(history)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func imsList(excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.imList, type:.im, excludeArchived: excludeArchived, success: {(channels) in
|
||||
success?(channels)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markIM(channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.imMark, channel: channel, timestamp: timestamp, success: {(ts) in
|
||||
success?(timestamp)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func openIM(userID: String, success: ((_ imID: String?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["token": token, "user": userID]
|
||||
networkInterface.request(.imOpen, parameters: parameters, successClosure: {(response) in
|
||||
let group = response["channel"] as? [String: Any]
|
||||
success?(group?["id"] as? String)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - MPIM
|
||||
public func closeMPIM(channel: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
close(.mpimClose, channelID: channel, success: {(closed) in
|
||||
success?(closed)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
history(.mpimHistory, id: id, latest: latest, oldest: oldest, inclusive: inclusive, count: count, unreads: unreads, success: {(history) in
|
||||
success?(history)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func mpimsList(excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
list(.mpimList, type:.group, excludeArchived: excludeArchived, success: {(channels) in
|
||||
success?(channels)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func markMPIM(channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
mark(.mpimMark, channel: channel, timestamp: timestamp, success: {(ts) in
|
||||
success?(timestamp)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func openMPIM(userIDs: [String], success: ((_ mpimID: String?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters = ["token": token, "users": userIDs.joined(separator: ",")]
|
||||
networkInterface.request(.mpimOpen, parameters: parameters, successClosure: {(response) in
|
||||
let group = response["group"] as? [String: Any]
|
||||
success?(group?["id"] as? String)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Pins
|
||||
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) in
|
||||
success?(ok)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
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) in
|
||||
success?(ok)
|
||||
}) {(error) in
|
||||
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: Any?] = ["token": token, "channel": channel, "file": file, "file_comment": fileComment, "timestamp": timestamp]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
react(.reactionsAdd, name: name, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {(ok) in
|
||||
success?(ok)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
react(.reactionsRemove, name: name, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {(ok) in
|
||||
success?(ok)
|
||||
}) {(error) in
|
||||
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: Any?] = ["token": token, "name": name, "file": file, "file_comment": fileComment, "channel": channel, "timestamp": timestamp]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
star(.starsAdd, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {(ok) in
|
||||
success?(ok)
|
||||
}) {(error) in
|
||||
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?) {
|
||||
star(.starsRemove, file: file, fileComment: fileComment, channel: channel, timestamp: timestamp, success: {(ok) in
|
||||
success?(ok)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
private func star(_ endpoint: Endpoint, file: String?, fileComment: String?, channel: String?, timestamp: String?, success: ((_ ok: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any?] = ["token": token, "file": file, "file_comment": fileComment, "channel": channel, "timestamp": timestamp]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//MARK: - Team
|
||||
public func teamInfo(success: ((_ info: [String: Any]?)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.teamInfo, parameters: ["token": token], successClosure: {(response) in
|
||||
success?(response["team"] as? [String: Any])
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Users
|
||||
public func userPresence(user: String, success: ((_ presence: String?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "user": user]
|
||||
networkInterface.request(.usersGetPresence, parameters: parameters, successClosure: {(response) in
|
||||
success?(response["presence"] as? String)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func userInfo(id: String, success: ((_ user: User)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "user": id]
|
||||
networkInterface.request(.usersInfo, parameters: parameters, successClosure: {(response) in
|
||||
success?(User(user: response["user"] as? [String: Any]))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func usersList(includePresence: Bool = false, success: ((_ userList: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "presence": includePresence]
|
||||
networkInterface.request(.usersList, parameters: parameters, successClosure: {(response) in
|
||||
success?(response["members"] as? [[String: Any]])
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setUserActive(success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
|
||||
networkInterface.request(.usersSetActive, parameters: ["token": token], successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
public func setUserPresence(presence: Presence, success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "presence": presence.rawValue]
|
||||
networkInterface.request(.usersSetPresence, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Channel Utilities
|
||||
private func close(_ endpoint: Endpoint, channelID: String, success: ((_ closed: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "channel": channelID]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
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: Any] = ["token": token, "channel": id, "latest": latest, "oldest": oldest, "inclusive": inclusive, "count": count, "unreads": unreads]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(History(history: response))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
private func info(_ endpoint: Endpoint, type: ChannelType, id: String, success: ((_ channel: Channel)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "channel": id]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(Channel(channel: response[type.rawValue] as? [String: Any]))
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
private func list(_ endpoint: Endpoint, type: ChannelType, excludeArchived: Bool = false, success: ((_ channels: [[String: Any]]?)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "exclude_archived": excludeArchived]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(response[type.rawValue+"s"] as? [[String: Any]])
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
private func mark(_ endpoint: Endpoint, channel: String, timestamp: String, success: ((_ ts: String)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "channel": channel, "ts": timestamp]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(timestamp)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func setInfo(_ endpoint: Endpoint, type: InfoType, channel: String, text: String, success: ((_ success: Bool)->Void)?, failure: FailureClosure?) {
|
||||
let parameters: [String: Any] = ["token": token, "channel": channel, type.rawValue: text]
|
||||
networkInterface.request(endpoint, parameters: parameters, successClosure: {(response) in
|
||||
success?(true)
|
||||
}) {(error) in
|
||||
failure?(error)
|
||||
}
|
||||
}
|
||||
|
||||
//MARK: - Encode Attachments
|
||||
private func encodeAttachments(_ attachments: [Attachment?]?) -> String? {
|
||||
if let attachments = attachments {
|
||||
var attachmentArray: [[String: Any]] = []
|
||||
for attachment in attachments {
|
||||
if let attachment = attachment {
|
||||
attachmentArray.append(attachment.dictionary)
|
||||
}
|
||||
}
|
||||
do {
|
||||
let data = try JSONSerialization.data(withJSONObject: attachmentArray, options: [])
|
||||
return String(data: data, encoding: String.Encoding.utf8)
|
||||
} catch _ {
|
||||
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
//MARK: - Enumerate Do Not Disturb Status
|
||||
private func enumerateDNDStatuses(_ statuses: [String: Any]) -> [String: DoNotDisturbStatus] {
|
||||
var retVal = [String: DoNotDisturbStatus]()
|
||||
for key in statuses.keys {
|
||||
retVal[key] = DoNotDisturbStatus(status: statuses[key] as? [String: Any])
|
||||
}
|
||||
return retVal
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,7 @@ open class WebhookServer: Server {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func replyForResponse(_ response: Response) -> Reply {
|
||||
private func replyForResponse(_ response: Response) -> Reply {
|
||||
if response.attachments == nil && response.responseType == nil {
|
||||
return Reply.text(body: response.text)
|
||||
} else {
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.1.0</string>
|
||||
<string>3.1.8</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.1.0</string>
|
||||
<string>3.1.8</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.1.0</string>
|
||||
<string>3.1.7</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
Reference in New Issue
Block a user