diff --git a/Package.resolved b/Package.resolved index 1bff5e5..b5d5554 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "repositoryURL": "https://github.com/apple/swift-log.git", "state": { "branch": null, - "revision": "74d7b91ceebc85daf387ebb206003f78813f71aa", - "version": "1.2.0" + "revision": "32e8d724467f8fe623624570367e3d50c5638e46", + "version": "1.5.2" } } ] diff --git a/Package.swift b/Package.swift index 19b3f42..eeba94e 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.2 +// swift-tools-version:5.6 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,7 +6,7 @@ import PackageDescription let package = Package( name: "swift-log-telegram", platforms: [ - .macOS(.v10_15) + .macOS(.v12) ], products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. @@ -14,7 +14,7 @@ let package = Package( ], dependencies: [ // Dependencies declare other packages that this package depends on. - .package(url: "https://github.com/apple/swift-log.git", from: "1.0.0") + .package(url: "https://github.com/apple/swift-log.git", from: "1.5.2") ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. diff --git a/Sources/LoggingTelegram/MarkdownLog.swift b/Sources/LoggingTelegram/MarkdownLog.swift index e313898..0368076 100644 --- a/Sources/LoggingTelegram/MarkdownLog.swift +++ b/Sources/LoggingTelegram/MarkdownLog.swift @@ -23,7 +23,7 @@ struct MarkdownLog: CustomStringConvertible { + "*\(message.telegramEscaping())*\n" + location.telegramEscaping() + (metadata.count > 0 ? "*Metadata*\n" : "") - + metadata.map { "*\($0.telegramEscaping())*: \($1)" }.joined(separator: "\n") + + metadata.map { "*\($0.telegramEscaping())*: \($1.telegramEscaping())" }.joined(separator: "\n") + (mentionedUsers.count > 0 ? "\n" : "") + mentionedUsers.map { "\($0)" }.joined(separator: " ") } diff --git a/Sources/LoggingTelegram/SynchronousDataTask.swift b/Sources/LoggingTelegram/SynchronousDataTask.swift deleted file mode 100644 index 78b09da..0000000 --- a/Sources/LoggingTelegram/SynchronousDataTask.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation - -#if canImport(FoundationNetworking) - import FoundationNetworking -#endif - -extension URLSession { - func synchronousDataTask(with request: URLRequest) -> (Data?, URLResponse?, Error?) { - var data: Data? - var response: URLResponse? - var error: Error? - - let semaphore = DispatchSemaphore(value: 0) - - let dataTask = self.dataTask(with: request) { - data = $0 - response = $1 - error = $2 - semaphore.signal() - } - - dataTask.resume() - - _ = semaphore.wait(timeout: .distantFuture) - - return (data, response, error) - } -} diff --git a/Sources/LoggingTelegram/TelegramLogHandler.swift b/Sources/LoggingTelegram/TelegramLogHandler.swift index c854087..d39819b 100644 --- a/Sources/LoggingTelegram/TelegramLogHandler.swift +++ b/Sources/LoggingTelegram/TelegramLogHandler.swift @@ -20,15 +20,9 @@ public var telegramLogDefaultLevel: Logger.Level = .critical /// Forked from `SlackLogHandler`. public class TelegramLogHandler: LogHandler where T: TelegramId { private var timestamp: String { - var buffer = [Int8](repeating: 0, count: 255) - var timestamp = time(nil) - let localTime = localtime(×tamp) - strftime(&buffer, buffer.count, "%Y-%m-%dT%H:%M:%S%z", localTime) - return buffer.withUnsafeBufferPointer { - $0.withMemoryRebound(to: CChar.self) { - String(cString: $0.baseAddress!) - } - } + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd HH:MM:SS" + return formatter.string(from: Date()) } /// The log label for the log handler. @@ -127,51 +121,42 @@ public class TelegramLogHandler: LogHandler where T: TelegramId { private func send(_ telegramMessage: Message) { let payload: Data - do { - payload = try JSONEncoder().encode(telegramMessage) - } catch { - print("Parsing error. ") - return - } - - var request = URLRequest(url: api) - request.httpMethod = "POST" - request.httpBody = payload - request.addValue("application/json", forHTTPHeaderField: "Content-Type") - request.addValue("application/json", forHTTPHeaderField: "Accept") - - let (data, resp, error) = URLSession.shared.synchronousDataTask(with: request) - - guard (resp as? HTTPURLResponse) != nil else { - print("Failed to send Telegram message with receiving error") - return - } - - if let error = error { - print("Failed to send Telegram message with connection error: \(error)") - } - - guard let returnData = data else { - return - } - - let returnStatus: TelegramReturn - - do { - returnStatus = try JSONDecoder().decode(TelegramReturn.self, from: returnData) - } catch { - print("Parsing error. ") - return - } + do { + payload = try JSONEncoder().encode(telegramMessage) + } catch { + print("Parsing error. ") + return + } - switch returnStatus { - case .error(let code, let message): - print("Failed to send Telegram message with error: \(code)") - print("Error message: " + message) - return - case .ok: - break - } + // Asynchronous telegram API request execution + var request = URLRequest(url: api) + request.httpMethod = "POST" + request.httpBody = payload + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + request.addValue("application/json", forHTTPHeaderField: "Accept") + + let task = URLSession.shared.dataTask(with: request) { data, response, error in + if let error { + print("Failed to send Telegram message: \(error)") + return + } + + if let data { + guard let status = try? JSONDecoder().decode(TelegramReturn.self, from: data) else { + print("Failed to send Telegram message: Response has incorrect format") + return + } + + switch status { + case .error(let code, let message): + print("Failed to send Telegram message with error: \(code)") + print("Error message: " + message) + case .ok: + break + } + } + } + task.resume() } struct Message: Encodable {