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

@ -5,6 +5,7 @@ WORKDIR /tmp/build
#install update system and install packages #install update system and install packages
RUN apk update RUN apk update
RUN apk upgrade --available RUN apk upgrade --available
RUN apk add alpine-sdk
#build bloaterbot #build bloaterbot
COPY . . COPY . .
@ -12,6 +13,8 @@ RUN go mod download
RUN mkdir /app RUN mkdir /app
ARG CGO_ENABLED=1
RUN go build -o /app/bloaterbot RUN go build -o /app/bloaterbot
WORKDIR /app WORKDIR /app

View file

@ -7,16 +7,34 @@ import (
"strings" "strings"
"time" "time"
"watn3y/bloaterbotv3/botIO" "watn3y/bloaterbotv3/botIO"
"watn3y/bloaterbotv3/commands/gaypoints"
"watn3y/bloaterbotv3/config" "watn3y/bloaterbotv3/config"
) )
func Commands(update tgbotapi.Update, bot *tgbotapi.BotAPI) { 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)
}
}

View file

@ -1,13 +1,18 @@
APIToken = "073fv3b07tvrudgbdf" APIToken = "073fv3b07tvrudgbdf"
DebugMode = true DebugMode = true
PrivilegedUsers = [1187583771] PrivilegedUsers = [1212121212]
[Nhentai] [Nhentai]
APIEndpoint = "0.0.0.0" APIEndpoint = "0.0.0.0"
Domain = "https://nhentai.net" Domain = "https://nhentai.net"
EnabledChats = [-1001737304244,-1001462089309,-1001616528600] EnabledChats = [-00000,-111111,-22222]
[Balonlyl] [Balonlyl]
EnabledChats = [-1001462089309] EnabledChats = [-1001462089309]
BalonlylAT = "@Balonlyl" BalonlylAT = "@Balonlyl"
TriggerWords = ["french","france","baguette","casque bleu"] TriggerWords = ["french","france","baguette","casque bleu"]
[GayPoints]
EnabledChats = [-00000,-111111,-22222]
ModifyUsers = [-00000,-111111,-22222]

View file

@ -22,6 +22,10 @@ type config struct {
BalonlylAT string BalonlylAT string
TriggerWords []string TriggerWords []string
} }
GayPoints struct {
EnabledChats []int64
ModifyUsers []int64
}
} }
var BotConfig config var BotConfig config

View file

@ -6,6 +6,7 @@ services:
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- /opt/bloaterbot/config.toml:/app/config.toml - /opt/bloaterbot/config.toml:/app/config.toml
- /opt/bloaterbot/bloater.db:/app/bloater.db
networks: networks:
- expose - expose
networks: networks:

7
go.mod
View file

@ -2,9 +2,8 @@ module watn3y/bloaterbotv3
go 1.20 go 1.20
require github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
require ( require (
github.com/BurntSushi/toml v1.2.1 // indirect github.com/BurntSushi/toml v1.2.1
gopkg.in/ini.v1 v1.67.0 // indirect github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
github.com/mattn/go-sqlite3 v1.14.16
) )

4
go.sum
View file

@ -2,5 +2,5 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc=
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=

View file

@ -1,11 +1,13 @@
package main package main
import ( import (
"watn3y/bloaterbotv3/commands/gaypoints"
"watn3y/bloaterbotv3/config" "watn3y/bloaterbotv3/config"
) )
func main() { func main() {
config.LoadConfig() config.LoadConfig()
gaypoints.InitDB()
bot() bot()
} }