new gaypoints feature

This commit is contained in:
Watn3y 2023-03-18 23:50:42 +01:00
parent 69e93622b3
commit 6115e09602
10 changed files with 310 additions and 14 deletions

View file

@ -7,16 +7,34 @@ import (
"strings"
"time"
"watn3y/bloaterbotv3/botIO"
"watn3y/bloaterbotv3/commands/gaypoints"
"watn3y/bloaterbotv3/config"
)
func Commands(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
if strings.ToLower(update.Message.Command()) == "shutup" || strings.ToLower(update.Message.Command()) == "shut" {
config.BotConfig.Shutup[update.Message.Chat.ID] = time.Now().UTC()
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Shutting up")
log.Println("Shutting up for Chat: " + strconv.FormatInt(update.Message.Chat.ID, 10))
cmd := strings.ToLower(update.Message.Command())
botIO.SendMessage(msg, bot)
switch cmd {
case "shutup":
shutup(update, bot)
case "shut":
shutup(update, bot)
case "gp":
gaypoints.GetGP(update, bot)
case "addgp":
gaypoints.SetGP(update, bot)
case "subtracktgp":
gaypoints.SetGP(update, bot)
}
}
func shutup(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
config.BotConfig.Shutup[update.Message.Chat.ID] = time.Now().UTC()
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Shutting up")
log.Println("Shutting up for Chat: " + strconv.FormatInt(update.Message.Chat.ID, 10))
botIO.SendMessage(msg, bot)
}

View file

@ -0,0 +1,167 @@
package gaypoints
import (
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"log"
"strconv"
"strings"
"watn3y/bloaterbotv3/botIO"
"watn3y/bloaterbotv3/commonlogic"
"watn3y/bloaterbotv3/config"
)
func GetGP(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
if !commonlogic.ContainsInt64(config.BotConfig.GayPoints.EnabledChats, update.Message.Chat.ID) {
return
}
if update.Message.ReplyToMessage != nil {
log.Println("[gaypoints] Looking for gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
points := sqlGetGP(update.Message.Chat.ID, update.Message.ReplyToMessage.From.ID)
currentUser := botIO.GetUserByID(update.Message.Chat.ID, update.Message.ReplyToMessage.From.ID, bot)
currentName := currentUser.User.FirstName
if currentUser.User.UserName != "" {
currentName = currentUser.User.UserName
}
messagetext := `<a href="` + `tg://user?id=` + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + `">` + currentName + `</a>` + ` currently has ` + `<b>` + strconv.FormatInt(points, 10) + `</b>` + ` gaypoints` + "\n"
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: messagetext,
}
botIO.SendMessage(message, bot)
return
}
log.Println("[gaypoints] Looking for gaypoints for chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
gps := sqlGetAllGP(update.Message.Chat.ID)
var messagetext string
for userid, points := range gps {
currentUser := botIO.GetUserByID(update.Message.Chat.ID, userid, bot)
currentName := currentUser.User.FirstName
if currentUser.User.UserName != "" {
currentName = currentUser.User.UserName
}
text := `<a href="` + `tg://user?id=` + strconv.FormatInt(userid, 10) + `">` + currentName + `</a>` + ` currently has ` + `<b>` + strconv.FormatInt(points, 10) + `</b>` + ` gaypoints` + "\n"
messagetext = messagetext + text
}
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: messagetext,
}
botIO.SendMessage(message, bot)
return
}
func SetGP(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
if !commonlogic.ContainsInt64(config.BotConfig.GayPoints.EnabledChats, update.Message.Chat.ID) || !commonlogic.ContainsInt64(config.BotConfig.GayPoints.ModifyUsers, update.Message.From.ID) {
return
}
cmd := strings.ToLower(update.Message.Command())
commandArgs := strings.Fields(update.Message.CommandArguments())
var arg string
if len(commandArgs) >= 1 {
arg = strings.ToLower(commandArgs[0])
} else {
arg = ""
}
log.Println("[gaypoints] Trying to modify gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
if update.Message.ReplyToMessage == nil {
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: "Please reply to a message to set gaypoints",
}
log.Println("[gaypoints] Failed to set gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
botIO.SendMessage(message, bot)
return
}
if arg == "" {
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: "Please specify a valid gaypoint value",
}
log.Println("[gaypoints] Failed to set gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
botIO.SendMessage(message, bot)
return
}
newPoints, err := strconv.ParseInt(arg, 10, 64)
if err != nil || newPoints <= 0 {
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: "Please specify a valid gaypoint value",
}
log.Println("[gaypoints] Failed to set gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
botIO.SendMessage(message, bot)
return
}
var finalgp int64
var currentPoints int64
if cmd == "addgp" {
currentPoints = sqlGetGP(update.Message.Chat.ID, update.Message.ReplyToMessage.From.ID)
if currentPoints <= -1 {
finalgp = newPoints
} else {
finalgp = currentPoints + newPoints
}
}
if cmd == "subtracktgp" {
currentPoints = sqlGetGP(update.Message.Chat.ID, update.Message.ReplyToMessage.From.ID)
if currentPoints <= 0 {
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: "Please specify a valid gaypoint value",
}
log.Println("[gaypoints] Failed to subtrackt gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
botIO.SendMessage(message, bot)
return
} else {
finalgp = currentPoints - newPoints
}
}
log.Println("[gaypoints] Changing gaypoints for user " + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10) + " from " + strconv.FormatInt(currentPoints, 10) + " to " + strconv.FormatInt(finalgp, 10))
sqlSetGP(update.Message.Chat.ID, update.Message.ReplyToMessage.From.ID, finalgp)
currentUser := botIO.GetUserByID(update.Message.Chat.ID, update.Message.ReplyToMessage.From.ID, bot)
currentName := currentUser.User.FirstName
if currentUser.User.UserName != "" {
currentName = currentUser.User.UserName
}
message := tgbotapi.MessageConfig{
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
ParseMode: "html",
DisableWebPagePreview: false,
Text: `<a href="` + `tg://user?id=` + strconv.FormatInt(update.Message.ReplyToMessage.From.ID, 10) + `">` + currentName + `</a>` + ` now has ` + `<b>` + strconv.FormatInt(finalgp, 10) + `</b>` + ` gaypoints` + "\n",
}
botIO.SendMessage(message, bot)
return
}

97
commands/gaypoints/sql.go Normal file
View file

@ -0,0 +1,97 @@
package gaypoints
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
"log"
"strconv"
)
var gpSelectUser *sql.Stmt
var gpSelectChat *sql.Stmt
var gpSet *sql.Stmt
func sqlGetAllGP(chatid int64) (gaypoints map[int64]int64) {
rows, err := gpSelectChat.Query(chatid)
if err != nil {
log.Panicf("Failed to query gaypoints: %v\n", err)
}
gaypoints = make(map[int64]int64)
var c int64
var b int64
for rows.Next() {
switch err := rows.Scan(&c, &b); err {
case sql.ErrNoRows:
gaypoints[c] = -1
case nil:
gaypoints[c] = b
default:
log.Panicf("Failed to query gaypoints: %v\n", err)
}
log.Println("[gaypoints.sql] Got gaypoints for " + strconv.FormatInt(c, 10) + " in chat " + strconv.FormatInt(chatid, 10) + ". Value is " + strconv.FormatInt(b, 10))
}
return gaypoints
}
func sqlGetGP(chatid int64, userid int64) (gaypoints int64) {
row := gpSelectUser.QueryRow(chatid, userid)
switch err := row.Scan(&gaypoints); err {
case sql.ErrNoRows:
gaypoints = -1
case nil:
break
default:
log.Panicf("Failed to query gaypoints: %v\n", err)
}
log.Println("[gaypoints.sql] Got gaypoints for " + strconv.FormatInt(userid, 10) + " in chat " + strconv.FormatInt(chatid, 10) + ". Value is " + strconv.FormatInt(gaypoints, 10))
return gaypoints
}
func sqlSetGP(chatid int64, userid int64, gaypoints int64) {
_, err := gpSet.Exec(chatid, userid, gaypoints)
if err != nil {
log.Panicf("Failed to set gaypoints: %v\n", err)
}
log.Println("[gaypoints.sql] Set gaypoints for " + strconv.FormatInt(userid, 10) + " in chat " + strconv.FormatInt(chatid, 10) + " to " + strconv.FormatInt(gaypoints, 10))
}
func InitDB() {
const dbPath string = "./bloater.db"
db, err := sql.Open("sqlite3", dbPath)
if err != nil {
log.Panicf("Failed to open sqlite database: %v\n", err)
}
_, err = db.Exec("CREATE TABLE IF NOT EXISTS gaypoints (chatid bigint, userid bigint,gaypoints bigint,UNIQUE(chatid,userid))")
if err != nil {
log.Panicf("Failed to create table: %v\n", err)
}
log.Println("[gaypoints.sql] Created sqlite table in database at " + dbPath)
gpSelectUser, err = db.Prepare("SELECT gaypoints FROM gaypoints WHERE chatid = ? AND userid = ?")
if err != nil {
log.Panicf("Failed to prepare sql select: %v\n", err)
}
gpSelectChat, err = db.Prepare("SELECT userid,gaypoints FROM gaypoints WHERE chatid = ? ORDER BY gaypoints DESC")
if err != nil {
log.Panicf("Failed to prepare sql select: %v\n", err)
}
gpSet, err = db.Prepare("INSERT OR REPLACE INTO gaypoints (chatid, userid, gaypoints) values (?,?,?)")
if err != nil {
log.Panicf("Failed to prepare sql insert: %v\n", err)
}
}