├── .gitignore ├── .swift-version ├── LICENSE ├── Makefile ├── Package.swift ├── README.md ├── Sources ├── Bot.swift ├── BotInfo.swift ├── DefaultEventMatcher.swift ├── EventMatcher.swift ├── EventObserver.swift ├── HelloEvent.swift ├── MessageEvent.swift ├── PeriodicBotService.swift ├── RTMEvent.swift ├── ReactionAddedEvent.swift ├── SlackChannel.swift ├── SlackDirectMessage.swift ├── SlackGroup.swift └── SlackUser.swift └── log.txt /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 3.0 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 J-Tech Creations, Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | build: 2 | @echo "Building..." 3 | swift build -Xcc -I/usr/local/include -Xlinker -L/usr/local/lib > log.txt 4 | 5 | clean: 6 | rm -rf .build Packages 7 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | let package = Package( 3 | name: "SwiftSlackBotter", 4 | dependencies: [ 5 | .Package(url: "https://github.com/Zewo/WebSocketClient.git", majorVersion: 0, minor: 14), 6 | .Package(url: "https://github.com/Zewo/Axis.git", majorVersion: 0, minor: 14), 7 | .Package(url: "https://github.com/Zewo/POSIX.git", majorVersion: 0, minor: 14), 8 | ] 9 | ) 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SwiftSlackBotter 2 | Slack Bot Framework for Swift Linux Command Line 3 | Created by J-Tech Creations, Inc. 4 | --- 5 | SwiftSlackBotter is Bot framework made for swift. Currently using Swift Version DEVELOPMENT-SNAPSHOT-2016-05-09-a released by Apple. Using Zewo 0.7 Frameworks and Environment 0.1 Frameworks. 6 | 7 | - [Zewo](https://github.com/Zewo/Zewo) 8 | - [Environment](https://github.com/czechboy0/Environment) 9 | 10 | # How to Setup Environment 11 | On this Readme, it focues for OSX El Capitan, but please see each sofware explains how on linux as well (Currently linux version is working fine.) 12 | 13 | ## Install Homebrew (If you have not already done it) 14 | 15 | [Homebrew](http://brew.sh/) is a package manager for OS X. 16 | 17 | ```sh 18 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 19 | ``` 20 | 21 | ## Install Swift Env 22 | [SwiftEnv](https://github.com/kylef/swiftenv) is a swift version manager to select swift snapshot by user / folder. Since Swift Slack Botter uses DEVELOPMENT-SNAPSHOT-2016-05-09-a , I reccomend you to use this to be able to choose specific Swift Runtime 23 | 24 | You can install swiftenv using the [Homebrew](http://brew.sh/) package manager 25 | on OS X. 26 | 27 | 1. Install swiftenv 28 | 29 | ```shell 30 | $ brew install kylef/formulae/swiftenv 31 | ``` 32 | 33 | 2. Then configure the shims and completions by adding the following to your profile. 34 | 35 | For Bash: 36 | 37 | ```shell 38 | $ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.bash_profile 39 | ``` 40 | 41 | **NOTE**: *On some platforms, you may need to modify `~/.bashrc` instead of `~/.bash_profile`.* 42 | 43 | For ZSH: 44 | 45 | ```shell 46 | $ echo 'if which swiftenv > /dev/null; then eval "$(swiftenv init -)"; fi' >> ~/.zshrc 47 | ``` 48 | 49 | For Fish: 50 | 51 | ```shell 52 | $ echo 'status --is-interactive; and . (swiftenv init -|psub)' >> ~/.config/fish/config.fish 53 | ``` 54 | 55 | ## Install Apple Swift Package 56 | Using SwiftEnv install Snapshot 57 | 58 | ```shell 59 | $ swiftenv install DEVELOPMENT-SNAPSHOT-2016-05-09-a 60 | ``` 61 | 62 | ## Install Zewo Runtime 63 | Zewo is web framework for swift, it is under development to adopt each latest swift snapshot. Currently Swift Slack Botter uses version 0.3. Please see how to install on their [Documents](https://github.com/Zewo/Zewo) 64 | 65 | ```sh 66 | brew install zewo/tap/zewo 67 | ``` 68 | 69 | Now we should be ready to create your own bot. 70 | # Create your first swift bot 71 | First we need to create a directory for our app. 72 | 73 | ```sh 74 | mkdir SwiftBotSample && cd SwiftBotSample 75 | ``` 76 | 77 | Then we install Swift Development Snapshot from **May 9, 2016**. 78 | 79 | ```sh 80 | swiftenv install DEVELOPMENT-SNAPSHOT-2016-05-09-a 81 | swiftenv local DEVELOPMENT-SNAPSHOT-2016-05-09-a 82 | ``` 83 | 84 | Now we initialize the project with Swift Package Manager (**SPM**). 85 | 86 | ```sh 87 | $ swift build --init 88 | Creating Package.swift 89 | Creating .gitignore 90 | Creating Sources/ 91 | Creating Sources/main.swift 92 | Creating Tests/ 93 | ``` 94 | 95 | This command will create the basic structure for our app. 96 | 97 | ``` 98 | . 99 | ├── Package.swift 100 | ├── Sources 101 | │ └── main.swift 102 | └── Tests 103 | ``` 104 | 105 | Open `Package.swift` with your favorite editor and add `SwiftSlackBotter` as dependencies. 106 | 107 | ```swift 108 | import PackageDescription 109 | 110 | let package = Package( 111 | name: "SwiftBotSample", 112 | dependencies: [ 113 | .Package(url: "https://github.com/tomohisa/SwiftSlackBotter.git", majorVersion: 0, minor: 3), 114 | ] 115 | ) 116 | ``` 117 | 118 | Now you can write code for your bot. Edit `Sources/main.swift` Simple Bot Server code would be like this. 119 | 120 | ```swift 121 | import SwiftSlackBotter 122 | 123 | do { 124 | let bot : Bot = try Bot() 125 | bot.addObserver(DefaultEventObserver(onMessage:{ 126 | (message:MessageEvent,bot:Bot) in 127 | try bot.reply("hello - " + bot.botInfo.userRealNameFor(message.user),event:message) 128 | })) 129 | try bot.start() 130 | } catch let error { 131 | print("Error Occured \(error)") 132 | } 133 | ``` 134 | 135 | ### This code: 136 | 137 | - Connect [rtm.start method | Slack ](https://api.slack.com/methods/rtm.start) method to retrieve websocket URL 138 | - Connect Slack with WebSocket as Bot 139 | - Receive message as bot 140 | - If bot receive message, it reply hello - (name of user who commented) 141 | 142 | Very simple bot eh. 143 | 144 | ### Slack Preperation 145 | 146 | - Create Bot User and Copy Tokens [Bot Users | Slack] (https://api.slack.com/bot-users) 147 | - Save Token in Environment Value (Add following code in `~/.bash_profile` file) 148 | 149 | ```sh 150 | export SLACK_BOT_TOKEN=xoxb-YOUR_SLACK_TOKEN 151 | ``` 152 | 153 | - Restart Terminal would be required. 154 | 155 | ### Build and run 156 | 157 | Now let's build the app. 158 | 159 | ```sh 160 | swift build -Xcc -I/usr/local/include -Xlinker -L/usr/local/lib 161 | ``` 162 | 163 | As of 2016/4/14, command line output is following 164 | ``` 165 | Cloning https://github.com/tomohisa/SwiftSlackBotter.git 166 | Using version 0.1.8 of package SwiftSlackBotter 167 | Cloning https://github.com/Zewo/WebSocket.git 168 | Using version 0.3.1 of package WebSocket 169 | Cloning https://github.com/Zewo/HTTP.git 170 | Using version 0.3.0 of package HTTP 171 | Cloning https://github.com/Zewo/Stream.git 172 | Using version 0.2.0 of package Stream 173 | Cloning https://github.com/Zewo/Data.git 174 | Using version 0.2.2 of package Data 175 | Cloning https://github.com/Zewo/System.git 176 | Using version 0.2.0 of package System 177 | Cloning https://github.com/Zewo/MediaType.git 178 | Using version 0.3.1 of package MediaType 179 | Cloning https://github.com/Zewo/InterchangeData.git 180 | Using version 0.3.0 of package InterchangeData 181 | Cloning https://github.com/Zewo/URI.git 182 | Using version 0.2.0 of package URI 183 | Cloning https://github.com/Zewo/CURIParser.git 184 | Using version 0.2.0 of package CURIParser 185 | Cloning https://github.com/Zewo/String.git 186 | Using version 0.2.6 of package String 187 | Cloning https://github.com/Zewo/CHTTPParser.git 188 | Using version 0.2.0 of package CHTTPParser 189 | Cloning https://github.com/Zewo/HTTPClient.git 190 | Using version 0.3.0 of package HTTPClient 191 | Cloning https://github.com/Zewo/TCP.git 192 | Using version 0.2.2 of package TCP 193 | Cloning https://github.com/Zewo/IP.git 194 | Using version 0.2.1 of package IP 195 | Cloning https://github.com/Zewo/Venice.git 196 | Using version 0.2.2 of package Venice 197 | Cloning https://github.com/Zewo/CLibvenice.git 198 | Using version 0.2.0 of package CLibvenice 199 | Cloning https://github.com/Zewo/HTTPSClient.git 200 | Using version 0.3.0 of package HTTPSClient 201 | Cloning https://github.com/Zewo/TCPSSL.git 202 | Using version 0.2.0 of package TCPSSL 203 | Cloning https://github.com/Zewo/OpenSSL.git 204 | Using version 0.2.4 of package OpenSSL 205 | Cloning https://github.com/Zewo/COpenSSL-OSX.git 206 | Using version 0.2.0 of package COpenSSL-OSX 207 | Cloning https://github.com/Zewo/File.git 208 | Using version 0.2.5 of package File 209 | Cloning https://github.com/Zewo/Event.git 210 | Using version 0.2.0 of package Event 211 | Cloning https://github.com/Zewo/Base64.git 212 | Using version 0.2.1 of package Base64 213 | Cloning https://github.com/Zewo/JSON.git 214 | Using version 0.3.1 of package JSON 215 | Cloning https://github.com/czechboy0/Environment.git 216 | Using version 0.1.0 of package Environment 217 | Cloning https://github.com/Zewo/Log.git 218 | Using version 0.3.0 of package Log 219 | Compiling Swift Module 'System' (1 sources) 220 | Linking Library: .build/debug/System.a 221 | Compiling Swift Module 'Data' (1 sources) 222 | Linking Library: .build/debug/Data.a 223 | Compiling Swift Module 'Stream' (1 sources) 224 | Linking Library: .build/debug/Stream.a 225 | Compiling Swift Module 'InterchangeData' (1 sources) 226 | Linking Library: .build/debug/InterchangeData.a 227 | Compiling Swift Module 'MediaType' (1 sources) 228 | Linking Library: .build/debug/MediaType.a 229 | Compiling Swift Module 'String' (1 sources) 230 | Linking Library: .build/debug/String.a 231 | Compiling Swift Module 'URI' (1 sources) 232 | Linking Library: .build/debug/URI.a 233 | Compiling Swift Module 'HTTP' (23 sources) 234 | Linking Library: .build/debug/HTTP.a 235 | Compiling Swift Module 'Venice' (16 sources) 236 | Linking Library: .build/debug/Venice.a 237 | Compiling Swift Module 'IP' (2 sources) 238 | Linking Library: .build/debug/IP.a 239 | Compiling Swift Module 'TCP' (7 sources) 240 | Linking Library: .build/debug/TCP.a 241 | Compiling Swift Module 'HTTPClient' (1 sources) 242 | Linking Library: .build/debug/HTTPClient.a 243 | Compiling Swift Module 'File' (3 sources) 244 | Linking Library: .build/debug/File.a 245 | Compiling Swift Module 'OpenSSL' (15 sources) 246 | Linking Library: .build/debug/OpenSSL.a 247 | Compiling Swift Module 'TCPSSL' (2 sources) 248 | Linking Library: .build/debug/TCPSSL.a 249 | Compiling Swift Module 'HTTPSClient' (1 sources) 250 | Linking Library: .build/debug/HTTPSClient.a 251 | Compiling Swift Module 'Event' (2 sources) 252 | Linking Library: .build/debug/Event.a 253 | Compiling Swift Module 'Base64' (1 sources) 254 | Linking Library: .build/debug/Base64.a 255 | Compiling Swift Module 'WebSocket' (5 sources) 256 | Linking Library: .build/debug/WebSocket.a 257 | Compiling Swift Module 'JSON' (5 sources) 258 | Linking Library: .build/debug/JSON.a 259 | Compiling Swift Module 'Environment' (1 sources) 260 | Linking Library: .build/debug/Environment.a 261 | Compiling Swift Module 'EnvironmentTests' (1 sources) 262 | /Users/tomohisa/Desktop/SwiftBotSample/Packages/Environment-0.1.0/Sources/EnvironmentTests/main.swift:9:63: warning: __FUNCTION__ is deprecated and will be removed in Swift 3, please use #function 263 | guard let path = Environment().getVar("PATH") else { return (__FUNCTION__, false) } 264 | ^~~~~~~~~~~~ 265 | #function 266 | /Users/tomohisa/Desktop/SwiftBotSample/Packages/Environment-0.1.0/Sources/EnvironmentTests/main.swift:10:10: warning: __FUNCTION__ is deprecated and will be removed in Swift 3, please use #function 267 | return (__FUNCTION__, !path.isEmpty) 268 | ^~~~~~~~~~~~ 269 | #function 270 | /Users/tomohisa/Desktop/SwiftBotSample/Packages/Environment-0.1.0/Sources/EnvironmentTests/main.swift:16:10: warning: __FUNCTION__ is deprecated and will be removed in Swift 3, please use #function 271 | return (__FUNCTION__, val == "FUZZY") 272 | ^~~~~~~~~~~~ 273 | #function 274 | /Users/tomohisa/Desktop/SwiftBotSample/Packages/Environment-0.1.0/Sources/EnvironmentTests/main.swift:22:40: warning: __FUNCTION__ is deprecated and will be removed in Swift 3, please use #function 275 | guard val == "FUZZIER" else { return (__FUNCTION__, false) } 276 | ^~~~~~~~~~~~ 277 | #function 278 | /Users/tomohisa/Desktop/SwiftBotSample/Packages/Environment-0.1.0/Sources/EnvironmentTests/main.swift:25:10: warning: __FUNCTION__ is deprecated and will be removed in Swift 3, please use #function 279 | return (__FUNCTION__, valFinal == nil) 280 | ^~~~~~~~~~~~ 281 | #function 282 | Linking Executable: .build/debug/EnvironmentTests 283 | Compiling Swift Module 'Log' (1 sources) 284 | Linking Library: .build/debug/Log.a 285 | Compiling Swift Module 'SwiftSlackBotter' (12 sources) 286 | Linking Library: .build/debug/SwiftSlackBotter.a 287 | Compiling Swift Module 'SwiftBotSample' (1 sources) 288 | Linking Executable: .build/debug/SwiftBotSample 289 | ``` 290 | 291 | 292 | 293 | After it compiles, run it. 294 | 295 | ```sh 296 | .build/debug/SwiftBotSample 297 | ``` 298 | 299 | Bot Start Running and bot user in Slack become Green. There are two way to talk to Bot. 300 | 301 | - Direct Message to Bot (Select Bot user to talk) 302 | - Invite Bot to Public or Private Channel 303 | 304 | Now if you talk anything in channel or Direct Message bot can listen, Bot reply and call your name like following image. 305 | 306 | ![Sample Bot Reaction](https://dl.dropboxusercontent.com/u/1157820/botsample.png) 307 | 308 | ## Roadmap 309 | This framework is building for specific project so it's not general-perpose use *Yet*. I am trying to make extensible and flexible using swift's closures and protocols. I want to make folloing feature if possible. 310 | 311 | - conversation defenetion 312 | - timer actitity 313 | - app support 314 | 315 | Thanks to Apple Swift Team and Zero/OpenSwift Team for this super cool programing and server enviromental framework! 316 | -------------------------------------------------------------------------------- /Sources/Bot.swift: -------------------------------------------------------------------------------- 1 | import WebSocketClient 2 | import Axis 3 | import HTTPClient 4 | import Venice 5 | 6 | public let logger = Logger(name: "swiftBot-Log") 7 | 8 | public class Bot { 9 | public enum BotError: Error { 10 | case ServerError 11 | case RTMConnectionError 12 | case SocketConnectionError 13 | case TokenError 14 | case InitializeError 15 | case EventUnmatchError 16 | case PostFailedError 17 | case ReactFails 18 | case WrongChannelName 19 | } 20 | let botToken : String 21 | var webSocketUrl : URL? = nil 22 | var client : HTTPClient.Client 23 | var webSocketClient : WebSocketClient? = nil 24 | let eventMatcher : EventMatcher 25 | public var botInfo : BotInfo = BotInfo() 26 | public var isBotActive : Bool = false 27 | public var observers = [EventObserver]() 28 | public func addObserver(observer:EventObserver) { 29 | observers.append(observer) 30 | } 31 | public var onConnected : ((Bot) -> Void)? = nil 32 | 33 | public var periodicBots = [PeriodicBotService]() 34 | public func add(periodicBot b:PeriodicBotService) { 35 | periodicBots.append(b) 36 | co { [weak self] in 37 | while b.done == false { 38 | guard let wself = self else { break } 39 | guard wself.isBotActive else { 40 | nap(for: 10.second) 41 | logger.debug("waiting for bot to become active ...") 42 | continue 43 | } 44 | do { 45 | if let serviceCall = b.serviceCall { 46 | logger.debug("running periodic bot...") 47 | try serviceCall(wself) 48 | logger.debug("finished running periodic bot...") 49 | } 50 | } catch let error { 51 | if let onError = b.onError { 52 | onError(error) 53 | } 54 | logger.info("Error on Periodic Service Bot\(error)") 55 | } 56 | nap(for: b.frequency) 57 | } 58 | guard let wself = self else { return } 59 | for (index, _) in wself.periodicBots.enumerated() { 60 | wself.periodicBots.remove(at: index) 61 | break 62 | } 63 | } 64 | } 65 | 66 | private let headers: Headers = ["Content-Type": "application/x-www-form-urlencoded"] 67 | 68 | public init (token: String? = nil, event_matcher : EventMatcher = DefaultEventMatcher()) throws { 69 | if token == nil { 70 | guard let t = environment["SLACK_BOT_TOKEN"] else { 71 | throw BotError.TokenError 72 | } 73 | self.botToken = t 74 | }else{ 75 | self.botToken = token! 76 | } 77 | self.eventMatcher = event_matcher 78 | do { 79 | guard let url = URL(string: "https://slack.com") else { throw BotError.InitializeError } 80 | self.client = try Client(url: url) 81 | } catch { 82 | throw BotError.InitializeError 83 | } 84 | } 85 | 86 | public func start() throws { 87 | try rtm_start() 88 | try socket_connect() 89 | } 90 | public func startInBackground() throws { 91 | try rtm_start() 92 | try socket_connect_in_background() 93 | } 94 | 95 | private func rtm_start() throws { 96 | do { 97 | var response :Response 98 | guard let url = URL(string: "https://slack.com") else { throw BotError.InitializeError } 99 | self.client = try Client(url: url) 100 | response = try client.get("/api/rtm.start?token=" + self.botToken) 101 | let buffer = try response.body.becomeBuffer(deadline: 3.second.fromNow()) 102 | let map = try JSONMapParser.parse(buffer) 103 | guard let urlws = map.dictionary?["url"]?.string else { 104 | throw BotError.RTMConnectionError 105 | } 106 | self.webSocketUrl = URL(string: urlws) 107 | self.botInfo = BotInfo(map: map) 108 | self.isBotActive = true 109 | } catch { 110 | throw BotError.RTMConnectionError 111 | } 112 | } 113 | 114 | private func socket_connect() throws { 115 | guard let uri = self.webSocketUrl else { 116 | throw BotError.RTMConnectionError 117 | } 118 | do { 119 | self.webSocketClient = try WebSocketClient(url: uri, connectionTimeout: 1.hour) { 120 | (socket: WebSocket) throws -> Void in 121 | logger.debug("setting up socket:") 122 | self.setupSocket(socket: socket) 123 | if let onConnected = self.onConnected { 124 | onConnected(self) 125 | } 126 | } 127 | try self.webSocketClient!.connect() 128 | logger.debug("successfully connected \(self.webSocketClient)") 129 | } catch let error { 130 | logger.error("\(error)") 131 | throw BotError.SocketConnectionError 132 | } 133 | } 134 | private func socket_connect_in_background() throws { 135 | guard let uri = self.webSocketUrl else { 136 | throw BotError.RTMConnectionError 137 | } 138 | do { 139 | self.webSocketClient = try WebSocketClient(url: uri) { 140 | (socket: WebSocket) throws -> Void in 141 | logger.debug("setting up socket:") 142 | self.setupSocket(socket: socket) 143 | if let onConnected = self.onConnected { 144 | onConnected(self) 145 | } 146 | } 147 | self.webSocketClient!.connectInBackground(failure: { (error) in 148 | logger.error("\(error)") 149 | }) 150 | logger.debug("successfully connected \(self.webSocketClient)") 151 | } catch let error { 152 | logger.error("\(error)") 153 | throw BotError.SocketConnectionError 154 | } 155 | } 156 | 157 | func setupSocket(socket: WebSocket) { 158 | let _ = socket.onText { (message: String) in try self.parseSlackEvent(message: message) } 159 | let _ = socket.onPing { (data) in try socket.pong() } 160 | let _ = socket.onPong { (data) in try socket.ping() } 161 | let _ = socket.onBinary { (data) in logger.debug(data) } 162 | let _ = socket.onClose { (code: CloseCode?, reason: String?) in 163 | logger.info("close with code: \(code), reason: \(reason ?? "no reason")") 164 | } 165 | } 166 | func parseSlackEvent(message: String) throws { 167 | guard let event = try self.eventMatcher.match(map: try JSONMapParser.parse(message)) else { 168 | return 169 | } 170 | logger.debug(event.type) 171 | for observer in observers { 172 | try observer.onEvent(event: event, bot:self) 173 | } 174 | } 175 | 176 | public func reply(message:String,event:MessageEvent) throws { 177 | guard let channel:String = event.channel else { 178 | return 179 | } 180 | try self.postMessage(channelID: channel,text:message,asUser:true) 181 | } 182 | 183 | public func postMessage(channelID: String, text:String, asUser:Bool = true, botName:String?=nil) throws { 184 | do { 185 | let body = "token=\(self.botToken)&channel=\(channelID)&text=\(text)&as_user=\(asUser)" + (botName == nil ? "" : "&username=\(botName)") 186 | guard let url = URL(string: "https://slack.com") else { throw BotError.InitializeError } 187 | self.client = try Client(url: url) 188 | let _ = try client.post("/api/chat.postMessage", headers: headers, body: body) 189 | } catch { throw BotError.PostFailedError } 190 | } 191 | public func postMessage(channelName: String, text:String, asUser:Bool = true, botName:String?=nil) throws { 192 | guard let channel = self.botInfo.channelIDFor(channelName) else { throw BotError.WrongChannelName } 193 | try postMessage(channelID: channel, text:text, asUser:asUser, botName:botName) 194 | } 195 | public func react(message:MessageEvent,with name:String) throws { 196 | do { 197 | guard let channel = message.channel, let timestamp = message.ts else { 198 | throw BotError.ReactFails 199 | } 200 | let body = "token=\(self.botToken)&name=\(name)&channel=\(channel)×tamp=\(timestamp)" 201 | logger.debug(body) 202 | guard let url = URL(string: "https://slack.com") else { throw BotError.InitializeError } 203 | self.client = try Client(url: url) 204 | let _ = try client.post("/api/reactions.add", headers: headers, body: body) 205 | } catch { 206 | throw BotError.ReactFails 207 | } 208 | } 209 | public func reactionGetFor(message:MessageEvent) throws -> MessageEvent? { 210 | do { 211 | guard let channel = message.channel, let timestamp = message.ts else { 212 | throw BotError.ReactFails 213 | } 214 | let body = "token=\(self.botToken)&channel=\(channel)×tamp=\(timestamp)" 215 | guard let url = URL(string: "https://slack.com") else { throw BotError.InitializeError } 216 | self.client = try Client(url: url) 217 | var response : Response = try client.post("/api/reactions.get", headers: headers, body: body) 218 | let map : Map = try JSONMapParser.parse(response.body.becomeBuffer(deadline: 3.seconds.fromNow())) 219 | guard let ok = map.dictionary?["ok"]?.bool else { return nil } 220 | guard ok == true else { return nil } 221 | if map.dictionary?["type"]?.string != "message" { return nil } 222 | guard let messageMap = map.dictionary?["message"] else { return nil } 223 | guard MessageEvent.isJSOMMatch(map: messageMap) else { return nil } 224 | var result = MessageEvent(map: messageMap) 225 | result.channel = channel 226 | return result 227 | } catch { 228 | throw BotError.ReactFails 229 | } 230 | } 231 | 232 | public func getPresenceFor(username:String) throws -> Bool? { 233 | do { 234 | let userID = botInfo.userIdFor(username:username) 235 | if userID == "" { 236 | throw BotError.ReactFails 237 | } 238 | let body = "token=\(self.botToken)&user=\(userID)" 239 | guard let url = URL(string: "https://slack.com") else { throw BotError.InitializeError } 240 | self.client = try Client(url: url) 241 | var response : Response = try client.post("/api/users.getPresence", headers: headers, body: body) 242 | let map : Map = try JSONMapParser.parse(response.body.becomeBuffer(deadline: 3.seconds.fromNow())) 243 | guard let ok = map.dictionary?["ok"]?.bool else { return nil } 244 | guard ok == true else { return nil } 245 | if map.dictionary?["presence"]?.string == "active" { return true } 246 | return false; 247 | } catch { 248 | throw BotError.ReactFails 249 | } 250 | } 251 | 252 | public func postDirectMessage(username name: String, text:String, asUser:Bool = true, botName:String?=nil) throws { 253 | try postMessage(channelID: botInfo.directMessageIdFor(username:name),text:text , asUser:asUser, botName:botName) 254 | } 255 | } 256 | -------------------------------------------------------------------------------- /Sources/BotInfo.swift: -------------------------------------------------------------------------------- 1 | // BotInfo.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct BotInfo { 26 | public enum ChannelType { 27 | case Channel 28 | case PrivateChannel 29 | case DirectMessage 30 | } 31 | public var users = [SlackUser]() 32 | public var channels = [SlackChannel]() 33 | public var groups = [SlackGroup]() 34 | public var ims = [SlackDirectMessage]() 35 | public var map: Map? 36 | 37 | public init(map:Map? = nil) { 38 | self.map = map 39 | guard let map = map else { 40 | return 41 | } 42 | logger.debug(map) 43 | do { 44 | if let users = map.dictionary?["users"]?.array { 45 | for user in users { 46 | self.users.append(try SlackUser(map:user)) 47 | } 48 | } 49 | if let channels = map.dictionary?["channels"]?.array { 50 | for channel in channels { 51 | self.channels.append(try SlackChannel(map:channel)) 52 | } 53 | } 54 | if let privateChannels = map.dictionary?["groups"]?.array { 55 | for privateChannel in privateChannels { 56 | self.groups.append(try SlackGroup(map:privateChannel)) 57 | } 58 | } 59 | if let directMessages = map.dictionary?["ims"]?.array { 60 | for im in directMessages { 61 | self.ims.append(try SlackDirectMessage(map:im)) 62 | } 63 | } 64 | } catch let error { 65 | logger.debug(error); 66 | } 67 | } 68 | 69 | public var botId : String? { 70 | get { 71 | guard let map = self.map else { return nil } 72 | return map.dictionary?["self"]?.dictionary?["id"]?.string 73 | } 74 | } 75 | public func channelType(id:String?) -> ChannelType? { 76 | guard let id = id else { 77 | return nil 78 | } 79 | for channel in channels { 80 | if channel.id == id && channel.is_channel { 81 | return .Channel 82 | } 83 | } 84 | for channel in groups { 85 | if channel.id == id && channel.is_group { 86 | return .PrivateChannel 87 | } 88 | } 89 | for channel in ims { 90 | if channel.id == id && channel.is_im { 91 | return .DirectMessage 92 | } 93 | } 94 | return nil 95 | } 96 | public func channelIDFor(_ name:String?) -> String? { 97 | guard let name = name else { return nil } 98 | for channel in channels { 99 | if channel.name == name && channel.is_channel { 100 | return channel.id 101 | } 102 | } 103 | for channel in groups { 104 | if channel.name == name && channel.is_group { 105 | return channel.id 106 | } 107 | } 108 | return nil 109 | } 110 | public func isChannel(id:String?) -> Bool { 111 | guard let id = id else { 112 | return false 113 | } 114 | for channel in channels { 115 | if channel.id == id && channel.is_channel { 116 | return true 117 | } 118 | } 119 | return false 120 | } 121 | public func userFor(id:String?) -> SlackUser? { 122 | guard let id = id else { 123 | return nil 124 | } 125 | for user in users { 126 | if user.id == id { 127 | return user 128 | } 129 | } 130 | return nil 131 | } 132 | public func usernameFor(id:String?) -> String { 133 | guard let id = id else { 134 | return "" 135 | } 136 | for user in users { 137 | if user.id == id { 138 | return user.name == nil ? "" : user.name! 139 | } 140 | } 141 | return "" 142 | } 143 | public func userRealNameFor(id:String?) -> String { 144 | guard let id = id else { 145 | return "" 146 | } 147 | for user in users { 148 | if user.id == id { 149 | return user.real_name == nil ? "" : user.real_name! 150 | } 151 | } 152 | return "" 153 | } 154 | public func userIdFor(username name:String?) -> String { 155 | guard let name = name else { 156 | return "" 157 | } 158 | for user in users { 159 | if user.name == name { 160 | if let userid = user.id { 161 | return userid 162 | } else { return "" } 163 | } 164 | } 165 | return "" 166 | } 167 | public func directMessageIdFor(userid id: String?) -> String { 168 | guard let id = id else { 169 | return "" 170 | } 171 | for directMessage in ims { 172 | if directMessage.user == id { 173 | guard let directMessageId = directMessage.id else { return "" } 174 | return directMessageId 175 | } 176 | } 177 | return "" 178 | } 179 | public func directMessageIdFor(channelID: String?) -> String { 180 | guard let id = channelID else { 181 | return "" 182 | } 183 | for directMessage in ims { 184 | if directMessage.id == id { 185 | guard let userID = directMessage.user else { return "" } 186 | return self.usernameFor(id: userID) 187 | } 188 | } 189 | return "" 190 | } 191 | public func directMessageIdFor(username name: String?) -> String { 192 | guard let name = name else { 193 | return "" 194 | } 195 | return directMessageIdFor(userid:userIdFor(username: name)) 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /Sources/DefaultEventMatcher.swift: -------------------------------------------------------------------------------- 1 | // DefaultEventMatcher.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public class DefaultEventMatcher : EventMatcher { 26 | public enum EventError : Error { 27 | case EventUnmatch 28 | case InvalidJson 29 | } 30 | public func match(rawdata: Buffer) throws -> RTMEvent? { 31 | return try self.match(map: try JSONMapParser.parse(rawdata)) 32 | } 33 | public func match(map: Map) throws -> RTMEvent? { 34 | if HelloEvent.isJSOMMatch(map: map) { 35 | return HelloEvent(map: map) 36 | } 37 | if MessageEvent.isJSOMMatch(map: map) { 38 | return MessageEvent(map: map) 39 | } 40 | if ReactionAddedEvent.isJSOMMatch(map: map) { 41 | return ReactionAddedEvent(map: map) 42 | } 43 | logger.debug(map) 44 | return nil 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Sources/EventMatcher.swift: -------------------------------------------------------------------------------- 1 | // EventMatcher.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public protocol EventMatcher { 26 | func match(map: Map) throws -> RTMEvent? 27 | } 28 | -------------------------------------------------------------------------------- /Sources/EventObserver.swift: -------------------------------------------------------------------------------- 1 | // EventObserver.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public protocol EventObserver { 26 | func onEvent(event:RTMEvent, bot:Bot) throws 27 | } 28 | 29 | public class DefaultEventObserver : EventObserver { 30 | public var onMessage : ((MessageEvent, Bot) throws -> Void)? = nil 31 | public var onOwnMessage : ((MessageEvent, Bot) throws -> Void)? = nil 32 | public var onHello : ((HelloEvent, Bot) throws -> Void)? = nil 33 | public init(onMessage:((MessageEvent, Bot) throws -> Void)? = nil) { 34 | self.onMessage = onMessage 35 | } 36 | public func onEvent(event:RTMEvent, bot:Bot) throws { 37 | logger.debug("botid=\(bot.botInfo.botId)") 38 | switch event { 39 | case let hello as HelloEvent: 40 | try onHello?(hello, bot) 41 | case let message as MessageEvent: 42 | if message.user == bot.botInfo.botId || message.isBotMessage { 43 | logger.debug("bot message") 44 | try onOwnMessage?(message, bot) 45 | } else { 46 | logger.debug("user message") 47 | try onMessage?(message, bot) 48 | } 49 | default: 50 | break; 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Sources/HelloEvent.swift: -------------------------------------------------------------------------------- 1 | // HelloEvent.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | 26 | public struct HelloEvent : RTMEvent { 27 | public var type : String = "" 28 | public static func isJSOMMatch(map: Map) -> Bool { 29 | guard let type = map.dictionary?["type"]?.string else { 30 | return false 31 | } 32 | if type == "hello" { 33 | return true; 34 | } 35 | return false; 36 | } 37 | public init(map: Map){ 38 | if let type = map.dictionary?["type"]?.string { 39 | self.type = type 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Sources/MessageEvent.swift: -------------------------------------------------------------------------------- 1 | // MessageEvent.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct Reactions { 26 | public var count : Int = 0 27 | public var name : String = "" 28 | public var users : [String] = [] 29 | public var map : Map? = nil 30 | public init(map: Map){ 31 | self.map = map 32 | if let count = map.dictionary?["count"]?.int { self.count = count } 33 | if let name = map.dictionary?["name"]?.string { self.name = name } 34 | if let users = map.dictionary?["users"]?.array { 35 | for userMap in users { 36 | if let user = userMap.string { self.users.append(user) } 37 | } 38 | } 39 | } 40 | } 41 | 42 | 43 | public struct MessageEvent : RTMEvent { 44 | public var type : String = "" 45 | public var channel : String? = nil 46 | public var user : String? = nil 47 | public var text : String? = nil 48 | public var ts : String? = nil 49 | public var reactions : [Reactions] = [] 50 | public var map : Map? = nil 51 | 52 | public init(map: Map) { 53 | self.map = map 54 | if let type = map.dictionary?["type"]?.string { self.type = type } 55 | if let channel = map.dictionary?["channel"]?.string { self.channel = channel } 56 | if let user = map.dictionary?["user"]?.string { self.user = user } 57 | if let text = map.dictionary?["text"]?.string { self.text = text } 58 | if let ts = map.dictionary?["ts"]?.string { self.ts = ts } 59 | if let reactions = map.dictionary?["reactions"]?.array { 60 | for reaction in reactions { 61 | self.reactions.append(Reactions(map: reaction)) 62 | } 63 | } 64 | } 65 | 66 | public var subtype : String? { 67 | get { 68 | guard let subtype = self.map?.dictionary?["subtype"]?.string else { return nil } 69 | return subtype 70 | } 71 | } 72 | public var isBotMessage : Bool { 73 | get { 74 | guard let subtype = self.subtype else { 75 | return false 76 | } 77 | logger.debug(subtype) 78 | return subtype == "bot_message" 79 | } 80 | } 81 | public static func isJSOMMatch(map: Map) -> Bool { 82 | guard let type = map.dictionary?["type"] else { 83 | return false 84 | } 85 | if type == "message" { 86 | return true; 87 | } 88 | return false; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Sources/PeriodicBotService.swift: -------------------------------------------------------------------------------- 1 | // SlackDirectMessage.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Venice 24 | public protocol PeriodicBotService { 25 | var done : Bool { get set } 26 | var frequency : Double { get set } 27 | var serviceCall : ((Bot) throws -> Void)? { get set } 28 | var onError : ((Error) -> Void)? { get set } 29 | } 30 | 31 | public struct DefaultBotService : PeriodicBotService { 32 | public var done : Bool = false 33 | public var frequency : Double 34 | public var serviceCall : ((Bot) throws -> Void)? = nil 35 | public var onError : ((Error) -> Void)? = nil 36 | public init(frequency f:Double, onService: ((Bot) throws -> Void)? = nil) { 37 | self.frequency = f 38 | serviceCall = onService 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/RTMEvent.swift: -------------------------------------------------------------------------------- 1 | // RTMEvent.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | // Based on following information 26 | // https://api.slack.com/events 27 | public protocol RTMEvent { 28 | var type : String { get set } 29 | static func isJSOMMatch(map: Map) -> Bool 30 | } 31 | 32 | public enum RTMEventError : Error { 33 | case InvalidType 34 | } 35 | -------------------------------------------------------------------------------- /Sources/ReactionAddedEvent.swift: -------------------------------------------------------------------------------- 1 | // ReactionAddedEvent.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct ReactionAddedEvent : RTMEvent { 26 | public var type : String = "" 27 | public var user : String? = nil 28 | public var reaction : String? = nil 29 | public var ts : String? = nil 30 | public var event_ts : String? = nil 31 | public var item_user : String? = nil 32 | public var item : RTMEvent? = nil 33 | 34 | public var map : Map? = nil 35 | 36 | public init(map: Map) { 37 | self.map = map 38 | if let type = map.dictionary?["type"]?.string { self.type = type } 39 | if let user = map.dictionary?["user"]?.string { self.user = user } 40 | if let reaction = map.dictionary?["reaction"]?.string { self.reaction = reaction } 41 | if let ts = map.dictionary?["ts"]?.string { self.ts = ts } 42 | if let event_ts = map.dictionary?["event_ts"]?.string { self.event_ts = event_ts } 43 | if let item_user = map.dictionary?["item_user"]?.string { self.item_user = item_user } 44 | if let itemMap = map.dictionary?["item"] { 45 | self.item = MessageEvent(map: itemMap) 46 | } 47 | } 48 | 49 | public static func isJSOMMatch(map: Map) -> Bool { 50 | guard let type = map.dictionary?["type"] else { 51 | return false 52 | } 53 | if type == "reaction_added" { 54 | return true; 55 | } 56 | return false; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Sources/SlackChannel.swift: -------------------------------------------------------------------------------- 1 | // SlackChannel.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct SlackChannel : MapConvertible { 26 | let is_channel : Bool 27 | let id : String? 28 | let creator : String? 29 | let is_archived : Bool 30 | let is_general : Bool 31 | let created : Int? 32 | let is_member : Bool 33 | let has_pins : Bool 34 | let name : String? 35 | } 36 | -------------------------------------------------------------------------------- /Sources/SlackDirectMessage.swift: -------------------------------------------------------------------------------- 1 | // SlackDirectMessage.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct SlackDirectMessage : MapConvertible { 26 | let is_org_shared : Bool = false 27 | let id : String? = nil 28 | let is_im : Bool = false 29 | // let created : String? = nil 30 | let user : String? = nil 31 | let unread_count : Int? = nil 32 | let has_pins : Bool = false 33 | let unread_count_display : Int? = nil 34 | // let is_open : Bool? = false 35 | } 36 | -------------------------------------------------------------------------------- /Sources/SlackGroup.swift: -------------------------------------------------------------------------------- 1 | // SlackGroup.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct SlackGroup : MapConvertible { 26 | var members = [String]() 27 | let creator : String? 28 | let is_archived : Bool 29 | let is_group : Bool 30 | let is_open : Bool 31 | let has_pins : Bool 32 | let is_mpim : Bool 33 | let name : String? 34 | let id : String? 35 | } 36 | -------------------------------------------------------------------------------- /Sources/SlackUser.swift: -------------------------------------------------------------------------------- 1 | // SlackUser.swift 2 | // The MIT License (MIT) 3 | // 4 | // Copyright (c) 2016 J-Tech Creations, Inc. 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | import Axis 24 | 25 | public struct SlackUser : MapConvertible { 26 | public let tz : String? = nil 27 | public let tz_offset : Int? = nil 28 | public let name : String? = nil 29 | public let tz_label : String? = nil 30 | public let id : String? = nil 31 | public let real_name : String? = nil 32 | public let team_id : String? = nil 33 | } 34 | -------------------------------------------------------------------------------- /log.txt: -------------------------------------------------------------------------------- 1 | Cloning https://github.com/Zewo/WebSocketClient.git 2 | HEAD is now at a385aec Merge pull request #3 from Zewo/connection_timerout 3 | Resolved version: 0.14.1 4 | Cloning https://github.com/Zewo/WebSocket.git 5 | HEAD is now at 3d6ff18 Timeout should be parameter (#21) 6 | Resolved version: 0.14.2 7 | Cloning https://github.com/Zewo/Axis.git 8 | HEAD is now at 40464b0 update Axis Linux tests 9 | Resolved version: 0.14.0 10 | Cloning https://github.com/Zewo/POSIX.git 11 | HEAD is now at 53c0569 POSIX: add Regex, update Regex to swift 3, API changes (#168) 12 | Resolved version: 0.14.1 13 | Cloning https://github.com/Zewo/CPOSIX.git 14 | HEAD is now at 04ff717 Create README.md 15 | Resolved version: 0.14.0 16 | Cloning https://github.com/Zewo/Reflection.git 17 | HEAD is now at 2bc1a76 make mappable tests public on reflection 18 | Resolved version: 0.14.0 19 | Cloning https://github.com/Zewo/CYAJL.git 20 | HEAD is now at 1e5e150 make it pure C 21 | Resolved version: 0.14.0 22 | Cloning https://github.com/Zewo/HTTPClient.git 23 | HEAD is now at 6b5fc55 update readme badges 24 | Resolved version: 0.14.0 25 | Cloning https://github.com/Zewo/Venice.git 26 | HEAD is now at fedb07e update readme badges 27 | Resolved version: 0.14.0 28 | Cloning https://github.com/Zewo/CLibvenice.git 29 | HEAD is now at 10a3489 Update README.md 30 | Resolved version: 0.14.0 31 | Cloning https://github.com/Zewo/HTTPFile.git 32 | HEAD is now at e0713a1 add HTTPFile tests 33 | Resolved version: 0.14.0 34 | Cloning https://github.com/Zewo/HTTP.git 35 | HEAD is now at 286e22a disable crashing test on linux 36 | Resolved version: 0.14.0 37 | Cloning https://github.com/Zewo/CHTTPParser.git 38 | HEAD is now at 88306ab Update README.md 39 | Resolved version: 0.14.0 40 | Cloning https://github.com/Zewo/File.git 41 | HEAD is now at f604b06 update readme badges 42 | Resolved version: 0.14.0 43 | Cloning https://github.com/Zewo/TCP.git 44 | HEAD is now at de7d18f express test only dep tcp 45 | Resolved version: 0.14.0 46 | Cloning https://github.com/Zewo/IP.git 47 | HEAD is now at fbf0b42 update readme badges 48 | Resolved version: 0.14.0 49 | Cloning https://github.com/Zewo/OpenSSL.git 50 | HEAD is now at cb24491 update readme badges 51 | Resolved version: 0.14.0 52 | Cloning https://github.com/Zewo/COpenSSL.git 53 | HEAD is now at a8a1ae7 Update README.md 54 | Resolved version: 0.14.0 55 | Compile CPOSIX posix.c 56 | Compile CYAJL yajl_version.c 57 | Compile CYAJL yajl_tree.c 58 | Compile CYAJL yajl_parser.c 59 | Compile CYAJL yajl_lex.c 60 | Compile CYAJL yajl_gen.c 61 | Compile CYAJL yajl_encode.c 62 | Compile CYAJL yajl_buf.c 63 | Compile CYAJL yajl_alloc.c 64 | Compile CYAJL yajl.c 65 | Compile CLibvenice unix.c 66 | Compile CLibvenice udp.c 67 | Compile CLibvenice timer.c 68 | Compile CLibvenice tcp.c 69 | Compile CLibvenice stack.c 70 | Compile CLibvenice slist.c 71 | Compile CLibvenice poller.c 72 | Compile CLibvenice list.c 73 | Compile CLibvenice ip.c 74 | Compile CLibvenice file.c 75 | Compile CLibvenice dns.c 76 | Compile CLibvenice debug.c 77 | Compile CLibvenice cr.c 78 | Compile CLibvenice chan.c 79 | Compile CHTTPParser http_parser.c 80 | Compile COpenSSL xts128.c 81 | Compile COpenSSL xcbc_enc.c 82 | Compile COpenSSL x_x509a.c 83 | Compile COpenSSL x_x509.c 84 | Compile COpenSSL x_val.c 85 | Compile COpenSSL x_spki.c 86 | Compile COpenSSL x_sig.c 87 | Compile COpenSSL x_req.c 88 | Compile COpenSSL x_pubkey.c 89 | Compile COpenSSL x_pkey.c 90 | Compile COpenSSL x_nx509.c 91 | Compile COpenSSL x_name.c 92 | Compile COpenSSL x_long.c 93 | Compile COpenSSL x_info.c 94 | Compile COpenSSL x_exten.c 95 | Compile COpenSSL x_crl.c 96 | Compile COpenSSL x_bignum.c 97 | Compile COpenSSL x_attrib.c 98 | Compile COpenSSL x_all.c 99 | Compile COpenSSL x_algor.c 100 | Compile COpenSSL x509type.c 101 | Compile COpenSSL x509spki.c 102 | Compile COpenSSL x509rset.c 103 | Compile COpenSSL x509name.c 104 | Compile COpenSSL x509cset.c 105 | Compile COpenSSL x509_vpm.c 106 | Compile COpenSSL x509_vfy.c 107 | Compile COpenSSL x509_v3.c 108 | Compile COpenSSL x509_txt.c 109 | Compile COpenSSL x509_trs.c 110 | Compile COpenSSL x509_set.c 111 | Compile COpenSSL x509_req.c 112 | Compile COpenSSL x509_r2x.c 113 | Compile COpenSSL x509_obj.c 114 | Compile COpenSSL x509_lu.c 115 | Compile COpenSSL x509_ext.c 116 | Compile COpenSSL x509_err.c 117 | Compile COpenSSL x509_def.c 118 | Compile COpenSSL x509_d2.c 119 | Compile COpenSSL x509_cmp.c 120 | Compile COpenSSL x509_att.c 121 | Compile COpenSSL wrap128.c 122 | Compile COpenSSL wp_dgst.c 123 | Compile COpenSSL wp_block.c 124 | Compile COpenSSL v3err.c 125 | Compile COpenSSL v3_utl.c 126 | Compile COpenSSL v3_sxnet.c 127 | Compile COpenSSL v3_skey.c 128 | Compile COpenSSL v3_scts.c 129 | Compile COpenSSL v3_purp.c 130 | Compile COpenSSL v3_prn.c 131 | Compile COpenSSL v3_pmaps.c 132 | Compile COpenSSL v3_pku.c 133 | Compile COpenSSL v3_pcons.c 134 | Compile COpenSSL v3_pcia.c 135 | Compile COpenSSL v3_pci.c 136 | Compile COpenSSL v3_ocsp.c 137 | Compile COpenSSL v3_ncons.c 138 | Compile COpenSSL v3_lib.c 139 | Compile COpenSSL v3_int.c 140 | Compile COpenSSL v3_info.c 141 | Compile COpenSSL v3_ia5.c 142 | Compile COpenSSL v3_genn.c 143 | Compile COpenSSL v3_extku.c 144 | Compile COpenSSL v3_enum.c 145 | Compile COpenSSL v3_crld.c 146 | Compile COpenSSL v3_cpols.c 147 | Compile COpenSSL v3_conf.c 148 | Compile COpenSSL v3_bitst.c 149 | Compile COpenSSL v3_bcons.c 150 | Compile COpenSSL v3_asid.c 151 | Compile COpenSSL v3_alt.c 152 | Compile COpenSSL v3_akeya.c 153 | Compile COpenSSL v3_akey.c 154 | Compile COpenSSL v3_addr.c 155 | Compile COpenSSL uid.c 156 | Compile COpenSSL ui_util.c 157 | Compile COpenSSL ui_openssl.c 158 | Compile COpenSSL ui_lib.c 159 | Compile COpenSSL ui_err.c 160 | Compile COpenSSL ui_compat.c 161 | Compile COpenSSL txt_db.c 162 | Compile COpenSSL ts_verify_ctx.c 163 | Compile COpenSSL ts_rsp_verify.c 164 | Compile COpenSSL ts_rsp_utils.c 165 | Compile COpenSSL ts_rsp_sign.c 166 | Compile COpenSSL ts_rsp_print.c 167 | Compile COpenSSL ts_req_utils.c 168 | Compile COpenSSL ts_req_print.c 169 | Compile COpenSSL ts_lib.c 170 | Compile COpenSSL ts_err.c 171 | Compile COpenSSL ts_conf.c 172 | Compile COpenSSL ts_asn1.c 173 | Compile COpenSSL tls_srp.c 174 | Compile COpenSSL th-lock.c 175 | Compile COpenSSL tb_store.c 176 | Compile COpenSSL tb_rsa.c 177 | Compile COpenSSL tb_rand.c 178 | Compile COpenSSL tb_pkmeth.c 179 | Compile COpenSSL tb_ecdsa.c 180 | Compile COpenSSL tb_ecdh.c 181 | Compile COpenSSL tb_dsa.c 182 | Compile COpenSSL tb_digest.c 183 | Compile COpenSSL tb_dh.c 184 | Compile COpenSSL tb_cipher.c 185 | Compile COpenSSL tb_asnmth.c 186 | Compile COpenSSL tasn_utl.c 187 | Compile COpenSSL tasn_typ.c 188 | Compile COpenSSL tasn_prn.c 189 | Compile COpenSSL tasn_new.c 190 | Compile COpenSSL tasn_fre.c 191 | Compile COpenSSL tasn_enc.c 192 | Compile COpenSSL tasn_dec.c 193 | Compile COpenSSL t_x509a.c 194 | Compile COpenSSL t_x509.c 195 | Compile COpenSSL t_spki.c 196 | Compile COpenSSL t_req.c 197 | Compile COpenSSL t_pkey.c 198 | Compile COpenSSL t_crl.c 199 | Compile COpenSSL t_bitst.c 200 | Compile COpenSSL t1_trce.c 201 | Compile COpenSSL t1_srvr.c 202 | Compile COpenSSL t1_reneg.c 203 | Compile COpenSSL t1_meth.c 204 | Compile COpenSSL t1_lib.c 205 | Compile COpenSSL t1_ext.c 206 | Compile COpenSSL t1_enc.c 207 | Compile COpenSSL t1_clnt.c 208 | Compile COpenSSL str2key.c 209 | Compile COpenSSL stack.c 210 | Compile COpenSSL ssl_utst.c 211 | Compile COpenSSL ssl_txt.c 212 | Compile COpenSSL ssl_stat.c 213 | Compile COpenSSL ssl_sess.c 214 | Compile COpenSSL ssl_rsa.c 215 | Compile COpenSSL ssl_lib.c 216 | Compile COpenSSL ssl_err2.c 217 | Compile COpenSSL ssl_err.c 218 | Compile COpenSSL ssl_conf.c 219 | Compile COpenSSL ssl_ciph.c 220 | Compile COpenSSL ssl_cert.c 221 | Compile COpenSSL ssl_asn1.c 222 | Compile COpenSSL ssl_algs.c 223 | Compile COpenSSL srp_vfy.c 224 | Compile COpenSSL srp_lib.c 225 | Compile COpenSSL sha_one.c 226 | Compile COpenSSL sha_dgst.c 227 | Compile COpenSSL sha512.c 228 | Compile COpenSSL sha256.c 229 | Compile COpenSSL sha1dgst.c 230 | Compile COpenSSL sha1_one.c 231 | Compile COpenSSL set_key.c 232 | Compile COpenSSL seed_ofb.c 233 | Compile COpenSSL seed_ecb.c 234 | Compile COpenSSL seed_cfb.c 235 | Compile COpenSSL seed_cbc.c 236 | Compile COpenSSL seed.c 237 | Compile COpenSSL s3_srvr.c 238 | Compile COpenSSL s3_pkt.c 239 | Compile COpenSSL s3_meth.c 240 | Compile COpenSSL s3_lib.c 241 | Compile COpenSSL s3_enc.c 242 | Compile COpenSSL s3_clnt.c 243 | Compile COpenSSL s3_cbc.c 244 | Compile COpenSSL s3_both.c 245 | Compile COpenSSL s2_srvr.c 246 | Compile COpenSSL s2_pkt.c 247 | Compile COpenSSL s2_meth.c 248 | Compile COpenSSL s2_lib.c 249 | Compile COpenSSL s2_enc.c 250 | Compile COpenSSL s2_clnt.c 251 | Compile COpenSSL s23_srvr.c 252 | Compile COpenSSL s23_pkt.c 253 | Compile COpenSSL s23_meth.c 254 | Compile COpenSSL s23_lib.c 255 | Compile COpenSSL s23_clnt.c 256 | Compile COpenSSL rsaz_exp.c 257 | Compile COpenSSL rsa_x931.c 258 | Compile COpenSSL rsa_ssl.c 259 | Compile COpenSSL rsa_sign.c 260 | Compile COpenSSL rsa_saos.c 261 | Compile COpenSSL rsa_pss.c 262 | Compile COpenSSL rsa_prn.c 263 | Compile COpenSSL rsa_pmeth.c 264 | Compile COpenSSL rsa_pk1.c 265 | Compile COpenSSL rsa_oaep.c 266 | Compile COpenSSL rsa_null.c 267 | Compile COpenSSL rsa_none.c 268 | Compile COpenSSL rsa_lib.c 269 | Compile COpenSSL rsa_gen.c 270 | Compile COpenSSL rsa_err.c 271 | Compile COpenSSL rsa_eay.c 272 | Compile COpenSSL rsa_depr.c 273 | Compile COpenSSL rsa_crpt.c 274 | Compile COpenSSL rsa_chk.c 275 | Compile COpenSSL rsa_asn1.c 276 | Compile COpenSSL rsa_ameth.c 277 | Compile COpenSSL rpc_enc.c 278 | Compile COpenSSL rmd_one.c 279 | Compile COpenSSL rmd_dgst.c 280 | Compile COpenSSL read2pwd.c 281 | Compile COpenSSL rc4_utl.c 282 | Compile COpenSSL rc4_skey.c 283 | Compile COpenSSL rc4_enc.c 284 | Compile COpenSSL rc2ofb64.c 285 | Compile COpenSSL rc2cfb64.c 286 | Compile COpenSSL rc2_skey.c 287 | Compile COpenSSL rc2_ecb.c 288 | Compile COpenSSL rc2_cbc.c 289 | Compile COpenSSL randfile.c 290 | Compile COpenSSL rand_win.c 291 | Compile COpenSSL rand_vms.c 292 | Compile COpenSSL rand_unix.c 293 | Compile COpenSSL rand_os2.c 294 | Compile COpenSSL rand_nw.c 295 | Compile COpenSSL rand_lib.c 296 | Compile COpenSSL rand_key.c 297 | Compile COpenSSL rand_err.c 298 | Compile COpenSSL rand_egd.c 299 | Compile COpenSSL qud_cksm.c 300 | Compile COpenSSL pvkfmt.c 301 | Compile COpenSSL pqueue.c 302 | Compile COpenSSL pmeth_lib.c 303 | Compile COpenSSL pmeth_gn.c 304 | Compile COpenSSL pmeth_fn.c 305 | Compile COpenSSL pkcs7err.c 306 | Compile COpenSSL pk7_smime.c 307 | Compile COpenSSL pk7_mime.c 308 | Compile COpenSSL pk7_lib.c 309 | Compile COpenSSL pk7_doit.c 310 | Compile COpenSSL pk7_dgst.c 311 | Compile COpenSSL pk7_attr.c 312 | Compile COpenSSL pk7_asn1.c 313 | Compile COpenSSL pk12err.c 314 | Compile COpenSSL pem_xaux.c 315 | Compile COpenSSL pem_x509.c 316 | Compile COpenSSL pem_sign.c 317 | Compile COpenSSL pem_seal.c 318 | Compile COpenSSL pem_pkey.c 319 | Compile COpenSSL pem_pk8.c 320 | Compile COpenSSL pem_oth.c 321 | Compile COpenSSL pem_lib.c 322 | Compile COpenSSL pem_info.c 323 | Compile COpenSSL pem_err.c 324 | Compile COpenSSL pem_all.c 325 | Compile COpenSSL pcy_tree.c 326 | Compile COpenSSL pcy_node.c 327 | Compile COpenSSL pcy_map.c 328 | Compile COpenSSL pcy_lib.c 329 | Compile COpenSSL pcy_data.c 330 | Compile COpenSSL pcy_cache.c 331 | Compile COpenSSL pcbc_enc.c 332 | Compile COpenSSL p_verify.c 333 | Compile COpenSSL p_sign.c 334 | Compile COpenSSL p_seal.c 335 | Compile COpenSSL p_open.c 336 | Compile COpenSSL p_lib.c 337 | Compile COpenSSL p_enc.c 338 | Compile COpenSSL p_dec.c 339 | Compile COpenSSL p8_pkey.c 340 | Compile COpenSSL p5_pbev2.c 341 | Compile COpenSSL p5_pbe.c 342 | Compile COpenSSL p5_crpt2.c 343 | Compile COpenSSL p5_crpt.c 344 | Compile COpenSSL p12_utl.c 345 | Compile COpenSSL p12_p8e.c 346 | Compile COpenSSL p12_p8d.c 347 | Compile COpenSSL p12_npas.c 348 | Compile COpenSSL p12_mutl.c 349 | Compile COpenSSL p12_kiss.c 350 | Compile COpenSSL p12_key.c 351 | Compile COpenSSL p12_init.c 352 | Compile COpenSSL p12_decr.c 353 | Compile COpenSSL p12_crt.c 354 | Compile COpenSSL p12_crpt.c 355 | Compile COpenSSL p12_attr.c 356 | Compile COpenSSL p12_asn.c 357 | Compile COpenSSL p12_add.c 358 | Compile COpenSSL openssl.c 359 | Compile COpenSSL openbsd_hw.c 360 | Compile COpenSSL ofb_enc.c 361 | Compile COpenSSL ofb64enc.c 362 | Compile COpenSSL ofb64ede.c 363 | Compile COpenSSL ofb128.c 364 | Compile COpenSSL ocsp_vfy.c 365 | Compile COpenSSL ocsp_srv.c 366 | Compile COpenSSL ocsp_prn.c 367 | Compile COpenSSL ocsp_lib.c 368 | Compile COpenSSL ocsp_ht.c 369 | Compile COpenSSL ocsp_ext.c 370 | Compile COpenSSL ocsp_err.c 371 | Compile COpenSSL ocsp_cl.c 372 | Compile COpenSSL ocsp_asn.c 373 | Compile COpenSSL obj_xref.c 374 | Compile COpenSSL obj_lib.c 375 | Compile COpenSSL obj_err.c 376 | Compile COpenSSL obj_dat.c 377 | Compile COpenSSL o_time.c 378 | Compile COpenSSL o_str.c 379 | Compile COpenSSL o_names.c 380 | Compile COpenSSL o_init.c 381 | Compile COpenSSL o_fips.c 382 | Compile COpenSSL o_dir.c 383 | Compile COpenSSL nsseq.c 384 | Compile COpenSSL names.c 385 | Compile COpenSSL n_pkey.c 386 | Compile COpenSSL mem_dbg.c 387 | Compile COpenSSL mem_clr.c 388 | Compile COpenSSL mem.c 389 | Compile COpenSSL mdc2dgst.c 390 | Compile COpenSSL mdc2_one.c 391 | Compile COpenSSL md_rand.c 392 | Compile COpenSSL md5_one.c 393 | Compile COpenSSL md5_dgst.c 394 | Compile COpenSSL md4_one.c 395 | Compile COpenSSL md4_dgst.c 396 | Compile COpenSSL m_wp.c 397 | Compile COpenSSL m_sigver.c 398 | Compile COpenSSL m_sha1.c 399 | Compile COpenSSL m_sha.c 400 | Compile COpenSSL m_ripemd.c 401 | Compile COpenSSL m_null.c 402 | Compile COpenSSL m_mdc2.c 403 | Compile COpenSSL m_md5.c 404 | Compile COpenSSL m_md4.c 405 | Compile COpenSSL m_md2.c 406 | Compile COpenSSL m_ecdsa.c 407 | Compile COpenSSL m_dss1.c 408 | Compile COpenSSL m_dss.c 409 | Compile COpenSSL lhash.c 410 | Compile COpenSSL lh_stats.c 411 | Compile COpenSSL kssl.c 412 | Compile COpenSSL krb5_asn.c 413 | Compile COpenSSL i_skey.c 414 | Compile COpenSSL i_ofb64.c 415 | Compile COpenSSL i_ecb.c 416 | Compile COpenSSL i_cfb64.c 417 | Compile COpenSSL i_cbc.c 418 | Compile COpenSSL i2d_pu.c 419 | Compile COpenSSL i2d_pr.c 420 | Compile COpenSSL hmac.c 421 | Compile COpenSSL hm_pmeth.c 422 | Compile COpenSSL hm_ameth.c 423 | Compile COpenSSL gosthash.c 424 | Compile COpenSSL gost_sign.c 425 | Compile COpenSSL gost_pmeth.c 426 | Compile COpenSSL gost_params.c 427 | Compile COpenSSL gost_md.c 428 | Compile COpenSSL gost_keywrap.c 429 | Compile COpenSSL gost_eng.c 430 | Compile COpenSSL gost_ctl.c 431 | Compile COpenSSL gost_crypt.c 432 | Compile COpenSSL gost_asn1.c 433 | Compile COpenSSL gost_ameth.c 434 | Compile COpenSSL gost94_keyx.c 435 | Compile COpenSSL gost89.c 436 | Compile COpenSSL gost2001_keyx.c 437 | Compile COpenSSL gost2001.c 438 | Compile COpenSSL gcm128.c 439 | Compile COpenSSL fips_ers.c 440 | Compile COpenSSL fcrypt_b.c 441 | Compile COpenSSL fcrypt.c 442 | Compile COpenSSL f_string.c 443 | Compile COpenSSL f_int.c 444 | Compile COpenSSL f_enum.c 445 | Compile COpenSSL ex_data.c 446 | Compile COpenSSL evp_pkey.c 447 | Compile COpenSSL evp_pbe.c 448 | Compile COpenSSL evp_lib.c 449 | Compile COpenSSL evp_key.c 450 | Compile COpenSSL evp_err.c 451 | Compile COpenSSL evp_enc.c 452 | Compile COpenSSL evp_cnf.c 453 | Compile COpenSSL evp_asn1.c 454 | Compile COpenSSL evp_acnf.c 455 | Compile COpenSSL err_prn.c 456 | Compile COpenSSL err_all.c 457 | Compile COpenSSL err.c 458 | Compile COpenSSL eng_table.c 459 | Compile COpenSSL eng_rdrand.c 460 | Compile COpenSSL eng_pkey.c 461 | Compile COpenSSL eng_openssl.c 462 | Compile COpenSSL eng_list.c 463 | Compile COpenSSL eng_lib.c 464 | Compile COpenSSL eng_init.c 465 | Compile COpenSSL eng_fat.c 466 | Compile COpenSSL eng_err.c 467 | Compile COpenSSL eng_dyn.c 468 | Compile COpenSSL eng_ctrl.c 469 | Compile COpenSSL eng_cryptodev.c 470 | Compile COpenSSL eng_cnf.c 471 | Compile COpenSSL eng_all.c 472 | Compile COpenSSL encode.c 473 | Compile COpenSSL enc_writ.c 474 | Compile COpenSSL enc_read.c 475 | Compile COpenSSL ede_cbcm_enc.c 476 | Compile COpenSSL ecs_vrf.c 477 | Compile COpenSSL ecs_sign.c 478 | Compile COpenSSL ecs_ossl.c 479 | Compile COpenSSL ecs_lib.c 480 | Compile COpenSSL ecs_err.c 481 | Compile COpenSSL ecs_asn1.c 482 | Compile COpenSSL ecp_smpl.c 483 | Compile COpenSSL ecp_oct.c 484 | Compile COpenSSL ecp_nistputil.c 485 | Compile COpenSSL ecp_nistp521.c 486 | Compile COpenSSL ecp_nistp256.c 487 | Compile COpenSSL ecp_nistp224.c 488 | Compile COpenSSL ecp_nist.c 489 | Compile COpenSSL ecp_mont.c 490 | Compile COpenSSL eck_prn.c 491 | Compile COpenSSL ech_ossl.c 492 | Compile COpenSSL ech_lib.c 493 | Compile COpenSSL ech_key.c 494 | Compile COpenSSL ech_kdf.c 495 | Compile COpenSSL ech_err.c 496 | Compile COpenSSL ecb_enc.c 497 | Compile COpenSSL ecb3_enc.c 498 | Compile COpenSSL ec_print.c 499 | Compile COpenSSL ec_pmeth.c 500 | Compile COpenSSL ec_oct.c 501 | Compile COpenSSL ec_mult.c 502 | Compile COpenSSL ec_lib.c 503 | Compile COpenSSL ec_key.c 504 | Compile COpenSSL ec_err.c 505 | Compile COpenSSL ec_cvt.c 506 | Compile COpenSSL ec_curve.c 507 | Compile COpenSSL ec_check.c 508 | Compile COpenSSL ec_asn1.c 509 | Compile COpenSSL ec_ameth.c 510 | Compile COpenSSL ec2_smpl.c 511 | Compile COpenSSL ec2_oct.c 512 | Compile COpenSSL ec2_mult.c 513 | Compile COpenSSL ebcdic.c 514 | Compile COpenSSL e_xcbc_d.c 515 | Compile COpenSSL e_ubsec_err.c 516 | Compile COpenSSL e_ubsec.c 517 | Compile COpenSSL e_sureware_err.c 518 | Compile COpenSSL e_sureware.c 519 | Compile COpenSSL e_seed.c 520 | Compile COpenSSL e_rc5.c 521 | Compile COpenSSL e_rc4_hmac_md5.c 522 | Compile COpenSSL e_rc4.c 523 | Compile COpenSSL e_rc2.c 524 | Compile COpenSSL e_padlock.c 525 | Compile COpenSSL e_old.c 526 | Compile COpenSSL e_nuron_err.c 527 | Compile COpenSSL e_nuron.c 528 | Compile COpenSSL e_null.c 529 | Compile COpenSSL e_idea.c 530 | Compile COpenSSL e_gost_err.c 531 | Compile COpenSSL e_gmp_err.c 532 | Compile COpenSSL e_gmp.c 533 | Compile COpenSSL e_des3.c 534 | Compile COpenSSL e_des.c 535 | Compile COpenSSL e_cswift_err.c 536 | Compile COpenSSL e_cswift.c 537 | Compile COpenSSL e_chil_err.c 538 | Compile COpenSSL e_chil.c 539 | Compile COpenSSL e_cast.c 540 | Compile COpenSSL e_capi_err.c 541 | Compile COpenSSL e_capi.c 542 | Compile COpenSSL e_camellia.c 543 | Compile COpenSSL e_bf.c 544 | Compile COpenSSL e_atalla_err.c 545 | Compile COpenSSL e_atalla.c 546 | Compile COpenSSL e_aes_cbc_hmac_sha256.c 547 | Compile COpenSSL e_aes_cbc_hmac_sha1.c 548 | Compile COpenSSL e_aes.c 549 | Compile COpenSSL e_aep_err.c 550 | Compile COpenSSL e_aep.c 551 | Compile COpenSSL e_4758cca_err.c 552 | Compile COpenSSL e_4758cca.c 553 | Compile COpenSSL dso_win32.c 554 | Compile COpenSSL dso_vms.c 555 | Compile COpenSSL dso_openssl.c 556 | Compile COpenSSL dso_null.c 557 | Compile COpenSSL dso_lib.c 558 | Compile COpenSSL dso_err.c 559 | Compile COpenSSL dso_dlfcn.c 560 | Compile COpenSSL dso_dl.c 561 | Compile COpenSSL dso_beos.c 562 | Compile COpenSSL dsa_vrf.c 563 | Compile COpenSSL dsa_sign.c 564 | Compile COpenSSL dsa_prn.c 565 | Compile COpenSSL dsa_pmeth.c 566 | Compile COpenSSL dsa_ossl.c 567 | Compile COpenSSL dsa_lib.c 568 | Compile COpenSSL dsa_key.c 569 | Compile COpenSSL dsa_gen.c 570 | Compile COpenSSL dsa_err.c 571 | Compile COpenSSL dsa_depr.c 572 | Compile COpenSSL dsa_asn1.c 573 | Compile COpenSSL dsa_ameth.c 574 | Compile COpenSSL digest.c 575 | Compile COpenSSL dh_rfc5114.c 576 | Compile COpenSSL dh_prn.c 577 | Compile COpenSSL dh_pmeth.c 578 | Compile COpenSSL dh_lib.c 579 | Compile COpenSSL dh_key.c 580 | Compile COpenSSL dh_kdf.c 581 | Compile COpenSSL dh_gen.c 582 | Compile COpenSSL dh_err.c 583 | Compile COpenSSL dh_depr.c 584 | Compile COpenSSL dh_check.c 585 | Compile COpenSSL dh_asn1.c 586 | Compile COpenSSL dh_ameth.c 587 | Compile COpenSSL des_old2.c 588 | Compile COpenSSL des_old.c 589 | Compile COpenSSL des_enc.c 590 | Compile COpenSSL d2i_pu.c 591 | Compile COpenSSL d2i_pr.c 592 | Compile COpenSSL d1_srvr.c 593 | Compile COpenSSL d1_srtp.c 594 | Compile COpenSSL d1_pkt.c 595 | Compile COpenSSL d1_meth.c 596 | Compile COpenSSL d1_lib.c 597 | Compile COpenSSL d1_clnt.c 598 | Compile COpenSSL d1_both.c 599 | Compile COpenSSL cversion.c 600 | Compile COpenSSL ctr128.c 601 | Compile COpenSSL cryptlib.c 602 | Compile COpenSSL cpt_err.c 603 | Compile COpenSSL conf_sap.c 604 | Compile COpenSSL conf_mod.c 605 | Compile COpenSSL conf_mall.c 606 | Compile COpenSSL conf_lib.c 607 | Compile COpenSSL conf_err.c 608 | Compile COpenSSL conf_def.c 609 | Compile COpenSSL conf_api.c 610 | Compile COpenSSL comp_lib.c 611 | Compile COpenSSL comp_err.c 612 | Compile COpenSSL cms_smime.c 613 | Compile COpenSSL cms_sd.c 614 | Compile COpenSSL cms_pwri.c 615 | Compile COpenSSL cms_lib.c 616 | Compile COpenSSL cms_kari.c 617 | Compile COpenSSL cms_io.c 618 | Compile COpenSSL cms_ess.c 619 | Compile COpenSSL cms_err.c 620 | Compile COpenSSL cms_env.c 621 | Compile COpenSSL cms_enc.c 622 | Compile COpenSSL cms_dd.c 623 | Compile COpenSSL cms_cd.c 624 | Compile COpenSSL cms_att.c 625 | Compile COpenSSL cms_asn1.c 626 | Compile COpenSSL cmll_utl.c 627 | Compile COpenSSL cmll_ofb.c 628 | Compile COpenSSL cmll_misc.c 629 | Compile COpenSSL cmll_ecb.c 630 | Compile COpenSSL cmll_ctr.c 631 | Compile COpenSSL cmll_cfb.c 632 | Compile COpenSSL cmll_cbc.c 633 | Compile COpenSSL cmac.c 634 | Compile COpenSSL cm_pmeth.c 635 | Compile COpenSSL cm_ameth.c 636 | Compile COpenSSL cfb_enc.c 637 | Compile COpenSSL cfb64enc.c 638 | Compile COpenSSL cfb64ede.c 639 | Compile COpenSSL cfb128.c 640 | Compile COpenSSL ccm128.c 641 | Compile COpenSSL cbc_enc.c 642 | Compile COpenSSL cbc_cksm.c 643 | Compile COpenSSL cbc3_enc.c 644 | Compile COpenSSL cbc128.c 645 | Compile COpenSSL camellia.c 646 | Compile COpenSSL c_zlib.c 647 | Compile COpenSSL c_skey.c 648 | Compile COpenSSL c_rle.c 649 | Compile COpenSSL c_ofb64.c 650 | Compile COpenSSL c_enc.c 651 | Compile COpenSSL c_ecb.c 652 | Compile COpenSSL c_cfb64.c 653 | Compile COpenSSL c_alld.c 654 | Compile COpenSSL c_allc.c 655 | Compile COpenSSL c_all.c 656 | Compile COpenSSL by_file.c 657 | Compile COpenSSL by_dir.c 658 | Compile COpenSSL buffer.c 659 | Compile COpenSSL buf_str.c 660 | Compile COpenSSL buf_err.c 661 | Compile COpenSSL bss_sock.c 662 | Compile COpenSSL bss_null.c 663 | Compile COpenSSL bss_mem.c 664 | Compile COpenSSL bss_log.c 665 | Compile COpenSSL bss_file.c 666 | Compile COpenSSL bss_fd.c 667 | Compile COpenSSL bss_dgram.c 668 | Compile COpenSSL bss_conn.c 669 | Compile COpenSSL bss_bio.c 670 | Compile COpenSSL bss_acpt.c 671 | Compile COpenSSL bn_x931p.c 672 | Compile COpenSSL bn_word.c 673 | Compile COpenSSL bn_sqrt.c 674 | Compile COpenSSL bn_sqr.c 675 | Compile COpenSSL bn_shift.c 676 | Compile COpenSSL bn_recp.c 677 | Compile COpenSSL bn_rand.c 678 | Compile COpenSSL bn_print.c 679 | Compile COpenSSL bn_prime.c 680 | Compile COpenSSL bn_nist.c 681 | Compile COpenSSL bn_mul.c 682 | Compile COpenSSL bn_mpi.c 683 | Compile COpenSSL bn_mont.c 684 | Compile COpenSSL bn_mod.c 685 | Compile COpenSSL bn_lib.c 686 | Compile COpenSSL bn_kron.c 687 | Compile COpenSSL bn_gf2m.c 688 | Compile COpenSSL bn_gcd.c 689 | Compile COpenSSL bn_exp2.c 690 | Compile COpenSSL bn_exp.c 691 | Compile COpenSSL bn_err.c 692 | Compile COpenSSL bn_div.c 693 | Compile COpenSSL bn_depr.c 694 | Compile COpenSSL bn_ctx.c 695 | Compile COpenSSL bn_const.c 696 | Compile COpenSSL bn_blind.c 697 | Compile COpenSSL bn_asm.c 698 | Compile COpenSSL bn_add.c 699 | Compile COpenSSL bio_ssl.c 700 | Compile COpenSSL bio_pk7.c 701 | Compile COpenSSL bio_ok.c 702 | Compile COpenSSL bio_ndef.c 703 | Compile COpenSSL bio_md.c 704 | Compile COpenSSL bio_lib.c 705 | Compile COpenSSL bio_err.c 706 | Compile COpenSSL bio_enc.c 707 | Compile COpenSSL bio_cb.c 708 | Compile COpenSSL bio_b64.c 709 | Compile COpenSSL bio_asn1.c 710 | Compile COpenSSL bf_skey.c 711 | Compile COpenSSL bf_ofb64.c 712 | Compile COpenSSL bf_null.c 713 | Compile COpenSSL bf_nbio.c 714 | Compile COpenSSL bf_lbuf.c 715 | Compile COpenSSL bf_enc.c 716 | Compile COpenSSL bf_ecb.c 717 | Compile COpenSSL bf_cfb64.c 718 | Compile COpenSSL bf_buff.c 719 | Compile COpenSSL b_sock.c 720 | Compile COpenSSL b_print.c 721 | Compile COpenSSL b_dump.c 722 | Compile COpenSSL asn_pack.c 723 | Compile COpenSSL asn_moid.c 724 | Compile COpenSSL asn_mime.c 725 | Compile COpenSSL asn1_par.c 726 | Compile COpenSSL asn1_lib.c 727 | Compile COpenSSL asn1_gen.c 728 | Compile COpenSSL asn1_err.c 729 | Compile COpenSSL ameth_lib.c 730 | Compile COpenSSL aes_wrap.c 731 | Compile COpenSSL aes_ofb.c 732 | Compile COpenSSL aes_misc.c 733 | Compile COpenSSL aes_ige.c 734 | Compile COpenSSL aes_ecb.c 735 | Compile COpenSSL aes_ctr.c 736 | Compile COpenSSL aes_core.c 737 | Compile COpenSSL aes_cfb.c 738 | Compile COpenSSL aes_cbc.c 739 | Compile COpenSSL a_verify.c 740 | Compile COpenSSL a_utf8.c 741 | Compile COpenSSL a_utctm.c 742 | Compile COpenSSL a_type.c 743 | Compile COpenSSL a_time.c 744 | Compile COpenSSL a_strnid.c 745 | Compile COpenSSL a_strex.c 746 | Compile COpenSSL a_sign.c 747 | Compile COpenSSL a_set.c 748 | Compile COpenSSL a_print.c 749 | Compile COpenSSL a_octet.c 750 | Compile COpenSSL a_object.c 751 | Compile COpenSSL a_mbstr.c 752 | Compile COpenSSL a_int.c 753 | Compile COpenSSL a_i2d_fp.c 754 | Compile COpenSSL a_gentm.c 755 | Compile COpenSSL a_enum.c 756 | Compile COpenSSL a_dup.c 757 | Compile COpenSSL a_digest.c 758 | Compile COpenSSL a_d2i_fp.c 759 | Compile COpenSSL a_bytes.c 760 | Compile COpenSSL a_bool.c 761 | Compile COpenSSL a_bitstr.c 762 | Compile Swift Module 'Reflection' (23 sources) 763 | Linking CPOSIX 764 | Linking CYAJL 765 | Linking CHTTPParser 766 | Linking CLibvenice 767 | Linking COpenSSL 768 | Compile Swift Module 'POSIX' (11 sources) 769 | Compile Swift Module 'Axis' (22 sources) 770 | Compile Swift Module 'Venice' (12 sources) 771 | Compile Swift Module 'OpenSSL' (13 sources) 772 | Compile Swift Module 'IP' (1 sources) 773 | Compile Swift Module 'File' (1 sources) 774 | Compile Swift Module 'HTTP' (29 sources) 775 | Compile Swift Module 'WebSocket' (7 sources) 776 | Compile Swift Module 'TCP' (5 sources) 777 | Compile Swift Module 'HTTPFile' (4 sources) 778 | Compile Swift Module 'HTTPClient' (2 sources) 779 | Compile Swift Module 'WebSocketClient' (1 sources) 780 | Compile Swift Module 'SwiftSlackBotter' (14 sources) 781 | --------------------------------------------------------------------------------