feat: add database integration and implement quote retrieval functionality

This commit is contained in:
purofle 2025-04-25 02:12:06 +08:00
parent 9bf6d3d9a4
commit d186309759
No known key found for this signature in database
5 changed files with 100 additions and 3 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea

5
go.mod
View File

@ -6,4 +6,7 @@ toolchain go1.22.1
require gopkg.in/telebot.v3 v3.3.8 require gopkg.in/telebot.v3 v3.3.8
require github.com/stretchr/testify v1.10.0 // indirect require (
github.com/lib/pq v1.10.9 // indirect
github.com/stretchr/testify v1.10.0 // indirect
)

2
go.sum
View File

@ -266,6 +266,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"database/sql"
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/purofle/remake_bot/quotely" "github.com/purofle/remake_bot/quotely"
@ -8,6 +9,7 @@ import (
"math/rand" "math/rand"
crand "math/rand" crand "math/rand"
"os" "os"
"strconv"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -177,7 +179,6 @@ func CommandEat(c tele.Context) error {
} }
func CommandOnText(c tele.Context) error { func CommandOnText(c tele.Context) error {
if c.Chat().ID != -1001965344356 { if c.Chat().ID != -1001965344356 {
return nil return nil
} }
@ -190,3 +191,81 @@ func CommandOnText(c tele.Context) error {
} }
return nil return nil
} }
func getQuote(text string) (error, []string, []string) {
var rows *sql.Rows
var err error
if text == "" {
query := "select text, \"from\" from result_new where from_id not like 'channel%' order by random() limit 50"
rows, err = database.Query(query)
} else {
query := "select text, \"from\" from result_new where from_id not like 'channel%' AND text like '%' || $1 || '%' order by random() limit 50"
rows, err = database.Query(query, text)
}
if err != nil {
return err, nil, nil
}
defer func(rows *sql.Rows) {
err := rows.Close()
if err != nil {
return
}
}(rows)
var resultText []string
var from []string
for rows.Next() {
var t, f string
if err := rows.Scan(&t, &f); err != nil {
return err, nil, nil
}
resultText = append(resultText, t)
from = append(from, f)
}
return nil, resultText, from
}
func InlineQuery(c tele.Context) error {
member, err := c.Bot().ChatMemberOf(
&tele.Chat{ID: -1001965344356},
c.Sender(),
)
if err != nil {
fmt.Println(fmt.Sprintf("sender: %s 不在群", c.Sender().FirstName))
return err
}
if member.Role != "creator" {
fmt.Println(fmt.Sprintf("sender: %s 不在群", c.Sender().FirstName))
return nil
}
var resultText []string
var from []string
if c.Query().Text == "" {
err, resultText, from = getQuote("")
} else {
err, resultText, from = getQuote(c.Query().Text)
}
results := make(tele.Results, len(resultText))
if err != nil {
return err
}
for i, text := range resultText {
results[i] = &tele.ArticleResult{
Title: text,
Text: fmt.Sprintf("%s: %s", from[i], text),
Description: fmt.Sprintf("来自 %s", from[i]),
}
results[i].SetResultID(strconv.Itoa(i))
}
return c.Answer(&tele.QueryResponse{
Results: results,
CacheTime: 0,
})
}

14
main.go
View File

@ -1,11 +1,14 @@
package main package main
import ( import (
"database/sql"
"log" "log"
"os" "os"
"time" "time"
tele "gopkg.in/telebot.v3" tele "gopkg.in/telebot.v3"
_ "github.com/lib/pq"
) )
type RemakeData struct { type RemakeData struct {
@ -15,6 +18,7 @@ type RemakeData struct {
} }
var remakeCount map[int64]*RemakeData var remakeCount map[int64]*RemakeData
var database *sql.DB
func main() { func main() {
pref := tele.Settings{ pref := tele.Settings{
@ -22,7 +26,14 @@ func main() {
Poller: &tele.LongPoller{Timeout: 10 * time.Second}, Poller: &tele.LongPoller{Timeout: 10 * time.Second},
} }
err := initList() connStr := "postgresql://postgres:114514@localhost:5432/postgres?sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
database = db
err = initList()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -35,6 +46,7 @@ func main() {
return return
} }
b.Handle(tele.OnQuery, InlineQuery)
b.Handle("/remake", CommandRemake) b.Handle("/remake", CommandRemake)
b.Handle("/remake_data", CommandRemakeData) b.Handle("/remake_data", CommandRemakeData)
b.Handle("/eat", CommandEat) b.Handle("/eat", CommandEat)