From 405ea9789b0e28eb7410ee3e35b1315ef855d0b2 Mon Sep 17 00:00:00 2001 From: Yehor Chernenko Date: Sat, 20 May 2023 22:47:09 +0800 Subject: [PATCH 1/5] Fix logging --- Sources/LoggingTelegram/MarkdownLog.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: " ") } From b7ae994b6b6902f3976c3787410da68b3b92d56d Mon Sep 17 00:00:00 2001 From: Yehor Chernenko Date: Mon, 22 May 2023 16:40:54 +0800 Subject: [PATCH 2/5] Remove URL session synchronous request --- Package.resolved | 4 +- Package.swift | 2 +- .../LoggingTelegram/SynchronousDataTask.swift | 28 --------- .../LoggingTelegram/TelegramLogHandler.swift | 59 +++++++------------ 4 files changed, 24 insertions(+), 69 deletions(-) delete mode 100644 Sources/LoggingTelegram/SynchronousDataTask.swift 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..fac9f51 100644 --- a/Package.swift +++ b/Package.swift @@ -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/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..81c7bef 100644 --- a/Sources/LoggingTelegram/TelegramLogHandler.swift +++ b/Sources/LoggingTelegram/TelegramLogHandler.swift @@ -134,44 +134,27 @@ public class TelegramLogHandler: LogHandler where T: TelegramId { 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 - } - - 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 + Task { + var request = URLRequest(url: api) + request.httpMethod = "POST" + request.httpBody = payload + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + request.addValue("application/json", forHTTPHeaderField: "Accept") + do { + let (data, _) = try await URLSession.shared.data(for: request) + let status = try JSONDecoder().decode(TelegramReturn.self, from: data) + switch status { + case .error(let code, let message): + print("Failed to send Telegram message with error: \(code)") + print("Error message: " + message) + case .ok: + break + } + } catch { + print("Failed to send Telegram message: \(error)") + } + } } struct Message: Encodable { From 8a865d4fcf4f98b0e8399ff55e4eb1562837194f Mon Sep 17 00:00:00 2001 From: Yehor Chernenko Date: Mon, 22 May 2023 21:53:10 +0800 Subject: [PATCH 3/5] Update MacOS version to enable async/await --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index fac9f51..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. From b823cb5bc1de4fcaf1b4994efcfd1a47ab1670a8 Mon Sep 17 00:00:00 2001 From: Yehor Chernenko Date: Mon, 22 May 2023 22:13:13 +0800 Subject: [PATCH 4/5] Remove concurrency --- .../LoggingTelegram/TelegramLogHandler.swift | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/Sources/LoggingTelegram/TelegramLogHandler.swift b/Sources/LoggingTelegram/TelegramLogHandler.swift index 81c7bef..9068df6 100644 --- a/Sources/LoggingTelegram/TelegramLogHandler.swift +++ b/Sources/LoggingTelegram/TelegramLogHandler.swift @@ -127,23 +127,32 @@ 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 - } + do { + payload = try JSONEncoder().encode(telegramMessage) + } catch { + print("Parsing error. ") + return + } // Asynchronous telegram API request execution - Task { - var request = URLRequest(url: api) - request.httpMethod = "POST" - request.httpBody = payload - request.addValue("application/json", forHTTPHeaderField: "Content-Type") - request.addValue("application/json", forHTTPHeaderField: "Accept") - do { - let (data, _) = try await URLSession.shared.data(for: request) - let status = try JSONDecoder().decode(TelegramReturn.self, from: data) + 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)") @@ -151,10 +160,9 @@ public class TelegramLogHandler: LogHandler where T: TelegramId { case .ok: break } - } catch { - print("Failed to send Telegram message: \(error)") } } + task.resume() } struct Message: Encodable { From b25960ad09df94bcea33db6ddd29c2fd0204f7b9 Mon Sep 17 00:00:00 2001 From: Yehor Chernenko Date: Sat, 27 May 2023 20:54:52 +0800 Subject: [PATCH 5/5] Update timestamp --- Sources/LoggingTelegram/TelegramLogHandler.swift | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Sources/LoggingTelegram/TelegramLogHandler.swift b/Sources/LoggingTelegram/TelegramLogHandler.swift index 9068df6..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.