feat: supported database sqlite and hashing userid
This commit is contained in:
parent
d1d0292045
commit
6a52f64753
7 changed files with 106 additions and 12 deletions
53
Sources/TelegramModeratorBot/Database.swift
Normal file
53
Sources/TelegramModeratorBot/Database.swift
Normal file
|
@ -0,0 +1,53 @@
|
|||
import GRDB
|
||||
|
||||
struct User: Codable, FetchableRecord, PersistableRecord {
|
||||
var userId: String
|
||||
var publicKey: String
|
||||
var isSpammer: Bool
|
||||
}
|
||||
|
||||
final class Database: Sendable {
|
||||
|
||||
private var dbWriter: any DatabaseWriter
|
||||
|
||||
init(_ dbWriter: any GRDB.DatabaseWriter) throws {
|
||||
self.dbWriter = dbWriter
|
||||
try migrator.migrate(dbWriter)
|
||||
}
|
||||
|
||||
let dbQueue = try DatabaseQueue(path: "./db.sqlite")
|
||||
|
||||
let db = try Connection("./db.sqlite")
|
||||
|
||||
#if DEBUG
|
||||
// Speed up development by nuking the database when migrations change
|
||||
// See <https://swiftpackageindex.com/groue/grdb.swift/documentation/grdb/migrations#The-eraseDatabaseOnSchemaChange-Option>
|
||||
migrator.eraseDatabaseOnSchemaChange = true
|
||||
#endif
|
||||
private var migrator: DatabaseMigrator {
|
||||
var migrator = DatabaseMigrator()
|
||||
migrator.registerMigration("v1") { db in
|
||||
try db.create(table: "users", { t in
|
||||
t.primaryKey("userId", .text).NotNull()
|
||||
t.column("publicKey", .text).NotNull()
|
||||
t.column("isSpammer", .bool)
|
||||
})
|
||||
return migrator
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension Database {
|
||||
static func makeConfiguration(_ base: Configuration = Configuration()) -> Configuration {
|
||||
var config = base
|
||||
return config
|
||||
}
|
||||
}
|
||||
|
||||
extension Database {
|
||||
func saveUser(_ userId: String, _ publicKey: String, _ isSpammer: Bool) throws {
|
||||
try dbWriter.write { db in
|
||||
try User.init(userId: userId, publicKey: publicKey, isSpammer: isSpammer).insert(db)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,18 +1,42 @@
|
|||
import Vapor
|
||||
import Crypto
|
||||
@preconcurrency import SwiftTelegramSdk
|
||||
|
||||
final class DefaultBotHandlers {
|
||||
static func addHandlers() async {
|
||||
await defaultBaseHandler()
|
||||
static func addHandlers(_ bot: TGBot) async {
|
||||
await defaultBaseHandler(bot)
|
||||
}
|
||||
|
||||
private static func defaultBaseHandler() async {
|
||||
private static func defaultBaseHandler(_ bot: TGBot) async {
|
||||
await botActor.bot.dispatcher.add(TGBaseHandler({ update in
|
||||
guard let message = update.message else { return }
|
||||
let params: TGSendMessageParams = .init(chatId: .chat(message.chat.id), text: """
|
||||
Help message
|
||||
""")
|
||||
try await botActor.bot.sendMessage(params: params)
|
||||
try await bot.sendMessage(params: params)
|
||||
}))
|
||||
}
|
||||
|
||||
private static func sendButtonOfAuth(_ bot: TGBot) async throws {
|
||||
await bot.dispatcher.add(TGCallbackQueryHandler(pattern: "Subscribe", { update in
|
||||
bot.log.info("press")
|
||||
let userId = update.callbackQuery!.from.id
|
||||
|
||||
let arrayBytesOfId = withUnsafeBytes(of: userId, Array.init)
|
||||
let hashedUserIdDigest = SHA512.hash(Data(arrayBytesOfId))
|
||||
// Convert Digest to hex string
|
||||
let hashedUserId = Data(hashedUserIdDigest).map { String(format: "%02x", $0) }.joined()
|
||||
|
||||
try? Database.saveUser(hashedUserId, "", false)
|
||||
|
||||
let params: TGAnswerCallbackQueryParams = .init(
|
||||
callbackQueryId: update.callbackQuery?.id ?? "0",
|
||||
text: update.callbackQuery?.data ?? "data not exit",
|
||||
showAlert: nil,
|
||||
url: nil,
|
||||
cacheTime: nil
|
||||
)
|
||||
try await bot.answerCallbackQuery(params: params)
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,9 @@ import Vapor
|
|||
@preconcurrency import SwiftTelegramSdk
|
||||
|
||||
public func configure(_ app: Application) async throws {
|
||||
guard let tgApi: String = Environment.get("TG_BOT_API") else { throw Errors.notVariable("Telegram key is not defined")}
|
||||
guard let tgApi: String = Environment.get("TG_BOT_API") else {
|
||||
throw Errors.notVariable("Telegram key is not defined")
|
||||
}
|
||||
app.logger.logLevel = .debug
|
||||
let bot: TGBot = try await .init(connectionType: .longpolling(limit: nil,
|
||||
timeout: nil,
|
||||
|
@ -14,7 +16,7 @@ public func configure(_ app: Application) async throws {
|
|||
botId: tgApi,
|
||||
log: app.logger)
|
||||
await botActor.setBot(bot)
|
||||
await DefaultBotHandlers.addHandlers()
|
||||
await DefaultBotHandlers.addHandlers(bot)
|
||||
try await botActor.bot.start()
|
||||
// try routes(app)
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
enum Errors: Error {
|
||||
case notVariable(String)
|
||||
case `default`(String)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue