Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| 28bd612ca0 | |||
| 45cf2a7ac0 | |||
| f7c986c65c | |||
| ca43df4475 | |||
| ef71b6abf0 | |||
| 3ff922a2c0 | |||
| 646c371bd3 |
@@ -1,2 +1,2 @@
|
||||
git "https://github.com/daltoniam/Starscream"
|
||||
git "https://github.com/pvzig/swifter.git"
|
||||
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.2"
|
||||
github "daltoniam/Starscream" "2.0.2"
|
||||
github "pvzig/swifter" "3.0.4"
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "SlackKit",
|
||||
targets: [],
|
||||
dependencies: [
|
||||
.Package(url: "https://github.com/pvzig/swifter.git",
|
||||
majorVersion: 3, minor: 0),
|
||||
.Package(url: "https://github.com/daltoniam/Starscream", majorVersion: 2, minor: 0)
|
||||
]
|
||||
)
|
||||
@@ -0,0 +1,18 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
|
||||
use_frameworks!
|
||||
|
||||
target 'SlackKit OS X' do
|
||||
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.2'
|
||||
pod 'Swifter', :git => 'https://github.com/pvzig/swifter.git', :tag => '3.0.4'
|
||||
end
|
||||
|
||||
target 'SlackKit tvOS' do
|
||||
pod 'Starscream', '~> 2.0.2'
|
||||
pod 'Swifter', :git => 'https://github.com/pvzig/swifter.git', :tag => '3.0.4'
|
||||
end
|
||||
@@ -0,0 +1,25 @@
|
||||
PODS:
|
||||
- Starscream (2.0.2)
|
||||
- Swifter (1.3.2)
|
||||
|
||||
DEPENDENCIES:
|
||||
- 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: 6c135a34e0a6e60cedaa0b30db67a4c05cf7cd38
|
||||
Swifter: dd1800ba8eb3e28b22b8bd20f91a8561a0110fac
|
||||
|
||||
PODFILE CHECKSUM: cd86ea0f8422027c9d5fa3c40243ae7a816fb79a
|
||||
|
||||
COCOAPODS: 1.1.0.rc.3
|
||||
@@ -1,6 +1,6 @@
|
||||

|
||||
|
||||
   [](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
|
||||
|
||||
@@ -13,6 +13,19 @@ To build the SlackKit project directly, first build the dependencies using Carth
|
||||
|
||||
### Installation
|
||||
|
||||
#### CocoaPods
|
||||
|
||||
Add SlackKit to your pod file:
|
||||
```
|
||||
use_frameworks!
|
||||
pod 'SlackKit', '~> 3.1.5'
|
||||
```
|
||||
and run
|
||||
```
|
||||
# Use CocoaPods version >= 1.1.0
|
||||
pod install
|
||||
```
|
||||
|
||||
#### Carthage
|
||||
|
||||
Add SlackKit to your Cartfile:
|
||||
@@ -23,16 +36,24 @@ 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"
|
||||
```
|
||||
**Note:** If you’re seeing long compile times with optimizations turned on, try updating to the latest version of Xcode, 8.2.1.
|
||||
|
||||
Drag the built `SlackKit.framework` into your Xcode project.
|
||||
|
||||
#### ~~CocoaPods~~
|
||||
#### ~~Swift Package Manager~~
|
||||
SlackKit doesn’t currently build correctly using CocoaPods or Swift Package Manager and Swift 3. I’m hoping to restore support for both soon.
|
||||
#### Swift Package Manager
|
||||
|
||||
Add SlackKit to your Package.swift
|
||||
```swift
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
dependencies: [
|
||||
.Package(url: "https://github.com/pvzig/SlackKit.git", majorVersion: 3)
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
Run `swift build` on your application’s main directory.
|
||||
|
||||
To use the library in your project import it:
|
||||
```
|
||||
@@ -64,7 +85,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()
|
||||
```
|
||||
@@ -87,7 +108,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()
|
||||
@@ -128,6 +149,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
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SlackKit"
|
||||
s.version = "3.1.5"
|
||||
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'
|
||||
s.author = { "Peter Zignego" => "peter@launchsoft.co" }
|
||||
s.source = { :git => "https://github.com/pvzig/SlackKit.git", :tag => s.version.to_s }
|
||||
s.social_media_url = 'https://twitter.com/pvzig'
|
||||
s.ios.deployment_target = '8.0'
|
||||
s.osx.deployment_target = '10.10'
|
||||
s.tvos.deployment_target = '9.0'
|
||||
s.requires_arc = true
|
||||
s.source_files = 'SlackKit/Sources/*.swift'
|
||||
s.frameworks = 'Foundation'
|
||||
s.dependency 'Starscream'
|
||||
s.dependency 'Swifter'
|
||||
end
|
||||
@@ -30,7 +30,6 @@
|
||||
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 */; };
|
||||
263993AB1CE90EE0004A6E93 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4307A07F1CC6D0910011D5DE /* Starscream.framework */; };
|
||||
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 */; };
|
||||
@@ -50,8 +49,13 @@
|
||||
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 */; };
|
||||
263993CA1CE90EED004A6E93 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4307A07F1CC6D0910011D5DE /* Starscream.framework */; };
|
||||
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 */; };
|
||||
@@ -77,7 +81,6 @@
|
||||
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 */; };
|
||||
26B30B6C1D289FA0004D4AB5 /* Swifter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26B30B6B1D289FA0004D4AB5 /* Swifter.framework */; };
|
||||
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 */; };
|
||||
@@ -145,9 +148,6 @@
|
||||
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 */; };
|
||||
26F76EB21D40318F00C3A3DD /* Swifter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 26B30B6E1D289FB2004D4AB5 /* Swifter.framework */; };
|
||||
26F76EB31D40319700C3A3DD /* Swifter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 269B47CB1D3AE5670042D137 /* Swifter.framework */; };
|
||||
4307A0801CC6D0910011D5DE /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4307A07F1CC6D0910011D5DE /* Starscream.framework */; };
|
||||
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 */; };
|
||||
@@ -161,6 +161,8 @@
|
||||
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>"; };
|
||||
@@ -217,8 +219,8 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4307A0801CC6D0910011D5DE /* Starscream.framework in Frameworks */,
|
||||
26B30B6C1D289FA0004D4AB5 /* Swifter.framework in Frameworks */,
|
||||
2659FC1B1DADC4E0003F3930 /* Starscream.framework in Frameworks */,
|
||||
2659FC1C1DADC4E0003F3930 /* Swifter.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -226,8 +228,8 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
263993AB1CE90EE0004A6E93 /* Starscream.framework in Frameworks */,
|
||||
26F76EB21D40318F00C3A3DD /* Swifter.framework in Frameworks */,
|
||||
2659FC1F1DADC4F2003F3930 /* Starscream.framework in Frameworks */,
|
||||
2659FC1D1DADC4F2003F3930 /* Swifter.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -235,8 +237,8 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
263993CA1CE90EED004A6E93 /* Starscream.framework in Frameworks */,
|
||||
26F76EB31D40319700C3A3DD /* Swifter.framework in Frameworks */,
|
||||
2659FC221DADC4FC003F3930 /* Starscream.framework in Frameworks */,
|
||||
2659FC201DADC4FC003F3930 /* Swifter.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -353,6 +355,8 @@
|
||||
CA70A3A1A9A1A259960DFBCF /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2659FC211DADC4FC003F3930 /* Starscream.framework */,
|
||||
2659FC1E1DADC4F2003F3930 /* Starscream.framework */,
|
||||
269B47CB1D3AE5670042D137 /* Swifter.framework */,
|
||||
26B30B6E1D289FB2004D4AB5 /* Swifter.framework */,
|
||||
26B30B6B1D289FA0004D4AB5 /* Swifter.framework */,
|
||||
@@ -678,8 +682,10 @@
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
@@ -725,8 +731,10 @@
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
@@ -755,7 +763,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -782,7 +790,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -810,6 +818,7 @@
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -818,7 +827,6 @@
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Carthage/Build/iOS",
|
||||
"$(PROJECT_DIR)/Carthage/Build/Mac",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info-iOS.plist";
|
||||
@@ -841,6 +849,7 @@
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -849,7 +858,6 @@
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Carthage/Build/iOS",
|
||||
"$(PROJECT_DIR)/Carthage/Build/Mac",
|
||||
);
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "$(SRCROOT)/SlackKit/Supporting Files/Info-iOS.plist";
|
||||
@@ -871,6 +879,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
@@ -900,6 +909,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -24,137 +24,135 @@
|
||||
internal extension Client {
|
||||
|
||||
func dispatch(_ event: [String: Any]) {
|
||||
let event = Event(event: event)
|
||||
guard let type = event.type else {
|
||||
return
|
||||
}
|
||||
let event = Event(event)
|
||||
let type = event.type ?? .error
|
||||
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:
|
||||
case .error:
|
||||
print("Error: \(event)")
|
||||
}
|
||||
}
|
||||
@@ -164,9 +162,9 @@ internal extension Client {
|
||||
return
|
||||
}
|
||||
switch subtype {
|
||||
case .MessageChanged:
|
||||
case .messageChanged:
|
||||
messageChanged(event)
|
||||
case .MessageDeleted:
|
||||
case .messageDeleted:
|
||||
messageDeleted(event)
|
||||
default:
|
||||
messageReceived(event)
|
||||
|
||||
@@ -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?
|
||||
@@ -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] {
|
||||
|
||||
@@ -23,108 +23,107 @@
|
||||
|
||||
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"
|
||||
}
|
||||
|
||||
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 +161,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
|
||||
|
||||
@@ -41,17 +41,16 @@ internal extension String {
|
||||
}
|
||||
|
||||
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 {
|
||||
} else if let value = self[key] {
|
||||
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
|
||||
|
||||
@@ -36,24 +36,23 @@ internal struct NetworkInterface {
|
||||
requestString += params.requestStringFromParameters
|
||||
}
|
||||
guard let url = URL(string: requestString) else {
|
||||
errorClosure(SlackError.ClientNetworkError)
|
||||
errorClosure(SlackError.clientNetworkError)
|
||||
return
|
||||
}
|
||||
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 +61,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)"
|
||||
var requestString = "\(apiUrl)\(Endpoint.filesUpload.rawValue)?token=\(token)"
|
||||
if let params = parameters {
|
||||
requestString = requestString + params.requestStringFromParameters
|
||||
}
|
||||
guard let url = URL(string: requestString) else {
|
||||
errorClosure(SlackError.ClientNetworkError)
|
||||
errorClosure(SlackError.clientNetworkError)
|
||||
return
|
||||
}
|
||||
var request = URLRequest(url:url)
|
||||
@@ -101,48 +99,45 @@ 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,14 +30,14 @@ internal protocol OAuthDelegate {
|
||||
|
||||
public struct OAuthServer {
|
||||
|
||||
fileprivate let oauthURL = "https://slack.com/oauth/authorize"
|
||||
private 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 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,7 +61,7 @@ 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."))
|
||||
@@ -78,7 +78,7 @@ public struct OAuthServer {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func oauthURLRequest(_ authorize: AuthorizeRequest) -> URLRequest? {
|
||||
private func oauthURLRequest(_ authorize: AuthorizeRequest) -> URLRequest? {
|
||||
var requestString = "\(oauthURL)?client_id=\(authorize.clientID)"
|
||||
requestString += authorize.parameters.requestStringFromParameters
|
||||
guard let url = URL(string: requestString) else {
|
||||
|
||||
@@ -60,7 +60,7 @@ open class Server {
|
||||
case .text(let body):
|
||||
return .ok(.text(body))
|
||||
case .json(let response):
|
||||
return .ok(.json(response.json))
|
||||
return .ok(.json(response.json as AnyObject))
|
||||
case .badRequest:
|
||||
return .badRequest(.text("Bad request."))
|
||||
}
|
||||
|
||||
@@ -22,101 +22,100 @@
|
||||
// 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"
|
||||
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
|
||||
case clientNetworkError
|
||||
case clientJSONError
|
||||
case clientOAuthError
|
||||
// HTTP
|
||||
case TooManyRequests
|
||||
case UnknownHTTPError
|
||||
case tooManyRequests
|
||||
case unknownHTTPError
|
||||
}
|
||||
|
||||
@@ -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)?
|
||||
|
||||
|
||||
+341
-391
File diff suppressed because it is too large
Load Diff
@@ -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.5</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.5</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.5</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
|
||||
Reference in New Issue
Block a user