init: 初始化仓库

This commit is contained in:
lixiangwuxian
2024-10-08 01:34:26 +08:00
commit 4d6c22ff7b
24 changed files with 1311 additions and 0 deletions

21
handler/echo/echo.go Normal file
View File

@@ -0,0 +1,21 @@
package echo
import (
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/model"
)
func init() {
handler.RegisterHandler("echo", echo)
}
func echo(msg model.Message) (reply model.Reply) {
if len(msg.Msg) <= 5 {
return model.Reply{}
}
return model.Reply{
ReplyMsg: msg.Msg[5:],
ReferOriginMsg: true,
FromMsg: msg,
}
}

61
handler/handler.go Normal file
View File

@@ -0,0 +1,61 @@
package handler
import (
"log"
"strings"
"git.lxtend.com/qqbot/model"
)
type Handler func(msg model.Message) (reply model.Reply)
var handlers = make(map[string]Handler)
var liveHandlers = make(map[int64]map[int64]Handler)
var privateAllHandler Handler
func RegisterPrivateHandler(handler Handler) {
privateAllHandler = handler
}
func RegisterHandler(trigger string, handler Handler) {
handlers[trigger] = handler
}
func RegisterLiveHandler(groupID int64, userID int64, handler Handler) { //userID=-1 means for all users in groupID
if _, ok := liveHandlers[groupID]; !ok {
liveHandlers[groupID] = make(map[int64]Handler)
}
liveHandlers[groupID][userID] = handler
}
func MsgInHandler(msg model.Message) (reply model.Reply) {
defer func() {
if r := recover(); r != nil {
log.Default().Printf("Recovered in MsgInHandler: %v", r)
}
}()
if msg.Msg != "" {
log.Default().Printf("M:%v", msg)
} else {
return model.Reply{}
}
defer func() {
if reply.ReplyMsg != "" {
log.Default().Printf("R:%v", reply)
}
}()
if handlerUserID, ok := liveHandlers[msg.GroupInfo.GroupId]; ok {
if handler, ok := handlerUserID[msg.UserId]; ok {
liveHandlers[msg.GroupInfo.GroupId][msg.UserId] = nil
return handler(msg)
}
}
msgArray := strings.Split(msg.Msg, " ")
if handler, ok := handlers[msgArray[0]]; ok {
return handler(msg)
}
if !msg.GroupInfo.IsGroupMsg && privateAllHandler != nil {
return privateAllHandler(msg)
}
return model.Reply{}
}

View File

@@ -0,0 +1,90 @@
package headmaster
import (
"context"
"fmt"
"strings"
"time"
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/model"
"git.lxtend.com/qqbot/util"
"github.com/sashabaranov/go-openai"
)
var (
histories = make(map[string][]openai.ChatCompletionMessage)
histories_time = make(map[string]time.Time)
)
func init() {
handler.RegisterHandler("校长", headmasterHandler)
handler.RegisterPrivateHandler(headmasterHandler)
}
func headmasterHandler(msg model.Message) (reply model.Reply) {
from := util.From(msg.GroupInfo.GroupId, msg.UserId)
if len(msg.Msg) > 7 && msg.Msg[0:7] == "校长 " {
return model.Reply{
ReplyMsg: ask(from, msg.Msg[7:]),
ReferOriginMsg: true,
FromMsg: msg,
}
}
// nickname := msg.UserNickName
return model.Reply{
ReplyMsg: ask(from, msg.Msg),
ReferOriginMsg: true,
FromMsg: msg,
}
}
func ask(from string, question string) (reply string) {
client := openai.NewClientWithConfig(openai.DefaultAzureConfig("none", "http://127.0.0.1:8000/v1"))
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: "minimind",
Messages: GenRequestFromUsr(from, question),
// Messages: []openai.ChatCompletionMessage{
// {
// Role: openai.ChatMessageRoleUser,
// Content: question,
// },
// },
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
return
}
AppendReplyToHistory(from, resp.Choices[0].Message.Content)
return enterFormatter(resp.Choices[0].Message.Content)
}
func enterFormatter(msgIn string) string {
return strings.ReplaceAll(msgIn, "\\n", "\n")
}
func GenRequestFromUsr(from string, question string) []openai.ChatCompletionMessage {
if _, ok := histories[from]; !ok || histories_time[from].Add(2*time.Minute).Before(time.Now()) {
histories[from] = make([]openai.ChatCompletionMessage, 0)
}
histories[from] = append(histories[from], openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser,
Content: question,
})
return histories[from]
}
func AppendReplyToHistory(from string, reply string) {
histories[from] = append(histories[from], openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleAssistant,
Content: reply,
})
histories_time[from] = time.Now()
for len(histories[from]) > 10 {
histories[from] = histories[from][1:]
}
}

30
handler/jrrp/jrrp.go Normal file
View File

@@ -0,0 +1,30 @@
package jrrp
import (
"fmt"
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/model"
"git.lxtend.com/qqbot/service/jrrp"
)
var jrrpInstance *jrrp.Jrrp
func init() {
jrrpInstance = jrrp.NewJrrp()
handler.RegisterHandler("今日人品", jrrpHandler)
handler.RegisterHandler("jrrp", jrrpHandler)
}
func jrrpHandler(msg model.Message) (reply model.Reply) {
luck, _ := jrrpInstance.GetJrrp(fmt.Sprint(msg.UserId))
nickname := msg.UserNickName
if msg.GroupInfo.IsGroupMsg && msg.GroupInfo.UserCard != "" {
nickname = msg.GroupInfo.UserCard
}
return model.Reply{
ReplyMsg: nickname + "同学你好,你的今日人品是:" + fmt.Sprint(luck),
ReferOriginMsg: true,
FromMsg: msg,
}
}

21
handler/say/say.go Normal file
View File

@@ -0,0 +1,21 @@
package say
import (
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/model"
)
func init() {
handler.RegisterHandler("记下", say)
}
func say(msg model.Message) (reply model.Reply) {
if len(msg.Msg) <= 5 {
return model.Reply{}
}
return model.Reply{
ReplyMsg: msg.Msg[5:],
ReferOriginMsg: true,
FromMsg: msg,
}
}

View File

@@ -0,0 +1,67 @@
package scoresaber
import (
"strconv"
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/model"
"git.lxtend.com/qqbot/service/scoresaber"
)
var scoresaberInstance *scoresaber.SSQuery
func init() {
scoresaberInstance = scoresaber.NewSSQuery()
handler.RegisterHandler("查ss", getScore)
handler.RegisterHandler("绑定ss", bindSS)
handler.RegisterHandler("解绑ss", unbindSS)
handler.RegisterHandler("最新ss", getRecentScore)
}
func getScore(msg model.Message) (reply model.Reply) {
return model.Reply{
ReplyMsg: scoresaberInstance.GetScore(strconv.Itoa(int(msg.UserId))),
ReferOriginMsg: true,
FromMsg: msg,
}
}
func bindSS(msg model.Message) (reply model.Reply) {
return model.Reply{
ReplyMsg: scoresaberInstance.BindSS(strconv.Itoa(int(msg.UserId)), msg.Msg[len("绑定ss "):]),
ReferOriginMsg: true,
FromMsg: msg,
}
}
func unbindSS(msg model.Message) (reply model.Reply) {
return model.Reply{
ReplyMsg: scoresaberInstance.UnbindSS(strconv.Itoa(int(msg.UserId))),
ReferOriginMsg: true,
FromMsg: msg,
}
}
func getRecentScore(msg model.Message) (reply model.Reply) {
count := 1
if len(msg.Msg) > len("最新ss ") {
var err error
count, err = strconv.Atoi(msg.Msg[len("最新ss "):])
if err != nil {
return model.Reply{
ReplyMsg: "",
ReferOriginMsg: true,
FromMsg: msg,
}
}
}
scoreMsg := ""
for _, v := range scoresaber.ScoresManager.GetRecentScores(count) {
scoreMsg += v.ToString() + "\n"
}
return model.Reply{
ReplyMsg: scoreMsg,
ReferOriginMsg: true,
FromMsg: msg,
}
}