Commit cc1093ff authored by Mrs4s's avatar Mrs4s Committed by GitHub

Merge pull request #333 from scjtqs/adminApiDev

admin api 初版
parents a712db5d e386a52f
......@@ -35,6 +35,7 @@ type JsonConfig struct {
PostMessageFormat string `json:"post_message_format"`
Debug bool `json:"debug"`
LogLevel string `json:"log_level"`
WebUi *GoCqWebUi `json:"web_ui"`
}
type CQHttpApiConfig struct {
......@@ -78,6 +79,12 @@ type GoCQReverseWebsocketConfig struct {
ReverseReconnectInterval uint16 `json:"reverse_reconnect_interval"`
}
type GoCqWebUi struct {
Enabled bool `json:"enabled"`
WebUiPort uint64 `json:"web_ui_port"`
WebInput bool `json:"webinput"`
}
func DefaultConfig() *JsonConfig {
return &JsonConfig{
EnableDB: true,
......@@ -121,6 +128,11 @@ func DefaultConfig() *JsonConfig {
ReverseReconnectInterval: 3000,
},
},
WebUi: &GoCqWebUi{
Enabled: true,
WebInput: false,
WebUiPort: 9999,
},
}
}
......
......@@ -94,3 +94,16 @@ func FindFile(f, cache, PATH string) (data []byte, err error) {
}
return
}
func DelFile(path string) bool {
err := os.Remove(path)
if err != nil {
// 删除失败
log.Error(err)
return false
} else {
// 删除成功
log.Info(path + "删除成功")
return true
}
}
......@@ -2,32 +2,27 @@ package main
import (
"bufio"
"bytes"
"crypto/md5"
"encoding/base64"
"encoding/json"
"fmt"
"image"
"github.com/Mrs4s/go-cqhttp/server"
"io"
"io/ioutil"
"os"
"os/signal"
"path"
"strconv"
"strings"
"time"
"github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client"
"github.com/Mrs4s/go-cqhttp/coolq"
"github.com/Mrs4s/go-cqhttp/global"
"github.com/Mrs4s/go-cqhttp/server"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
log "github.com/sirupsen/logrus"
easy "github.com/t-tomalak/logrus-easy-formatter"
asciiart "github.com/yinghau76/go-ascii-art"
"github.com/t-tomalak/logrus-easy-formatter"
)
func init() {
......@@ -238,109 +233,22 @@ func main() {
cli.OnServerUpdated(func(bot *client.QQClient, e *client.ServerUpdatedEvent) {
log.Infof("收到服务器地址更新通知, 将在下一次重连时应用. ")
})
rsp, err := cli.Login()
for {
global.Check(err)
if !rsp.Success {
switch rsp.Error {
case client.NeedCaptcha:
_ = ioutil.WriteFile("captcha.jpg", rsp.CaptchaImage, 0644)
img, _, _ := image.Decode(bytes.NewReader(rsp.CaptchaImage))
fmt.Println(asciiart.New("image", img).Art)
log.Warn("请输入验证码 (captcha.jpg): (Enter 提交)")
text, _ := console.ReadString('\n')
rsp, err = cli.SubmitCaptcha(strings.ReplaceAll(text, "\n", ""), rsp.CaptchaSign)
continue
case client.UnsafeDeviceError:
log.Warnf("账号已开启设备锁,请前往 -> %v <- 验证并重启Bot.", rsp.VerifyUrl)
log.Infof(" 按 Enter 继续....")
_, _ = console.ReadString('\n')
return
case client.OtherLoginError, client.UnknownLoginError:
log.Fatalf("登录失败: %v", rsp.ErrorMessage)
}
if conf.WebUi == nil {
conf.WebUi = &global.GoCqWebUi{
Enabled: true,
WebInput: false,
WebUiPort: 9999,
}
break
}
log.Infof("登录成功 欢迎使用: %v", cli.Nickname)
time.Sleep(time.Second)
log.Info("开始加载好友列表...")
global.Check(cli.ReloadFriendList())
log.Infof("共加载 %v 个好友.", len(cli.FriendList))
log.Infof("开始加载群列表...")
global.Check(cli.ReloadGroupList())
log.Infof("共加载 %v 个群.", len(cli.GroupList))
b := coolq.NewQQBot(cli, conf)
if conf.PostMessageFormat != "string" && conf.PostMessageFormat != "array" {
log.Warnf("post_message_format 配置错误, 将自动使用 string")
coolq.SetMessageFormat("string")
} else {
coolq.SetMessageFormat(conf.PostMessageFormat)
}
if conf.RateLimit.Enabled {
global.InitLimiter(conf.RateLimit.Frequency, conf.RateLimit.BucketSize)
}
log.Info("正在加载事件过滤器.")
global.BootFilter()
coolq.IgnoreInvalidCQCode = conf.IgnoreInvalidCQCode
coolq.ForceFragmented = conf.ForceFragmented
if conf.HttpConfig != nil && conf.HttpConfig.Enabled {
server.HttpServer.Run(fmt.Sprintf("%s:%d", conf.HttpConfig.Host, conf.HttpConfig.Port), conf.AccessToken, b)
for k, v := range conf.HttpConfig.PostUrls {
server.NewHttpClient().Run(k, v, conf.HttpConfig.Timeout, b)
}
if conf.WebUi.WebUiPort <= 0 {
conf.WebUi.WebUiPort = 9999
}
if conf.WSConfig != nil && conf.WSConfig.Enabled {
server.WebsocketServer.Run(fmt.Sprintf("%s:%d", conf.WSConfig.Host, conf.WSConfig.Port), conf.AccessToken, b)
confErr := conf.Save("config.json")
if confErr != nil {
log.Error("保存配置文件失败")
}
for _, rc := range conf.ReverseServers {
server.NewWebsocketClient(rc, conf.AccessToken, b).Run()
}
log.Info("资源初始化完成, 开始处理信息.")
log.Info("アトリは、高性能ですから!")
cli.OnDisconnected(func(bot *client.QQClient, e *client.ClientDisconnectedEvent) {
if conf.ReLogin.Enabled {
var times uint = 1
for {
if cli.Online {
log.Warn("Bot已登录")
return
}
if conf.ReLogin.MaxReloginTimes != 0 && times > conf.ReLogin.MaxReloginTimes {
break
}
log.Warnf("Bot已离线 (%v),将在 %v 秒后尝试重连. 重连次数:%v",
e.Message, conf.ReLogin.ReLoginDelay, times)
times++
time.Sleep(time.Second * time.Duration(conf.ReLogin.ReLoginDelay))
rsp, err := cli.Login()
if err != nil {
log.Errorf("重连失败: %v", err)
continue
}
if !rsp.Success {
switch rsp.Error {
case client.NeedCaptcha:
log.Fatalf("重连失败: 需要验证码. (验证码处理正在开发中)")
case client.UnsafeDeviceError:
log.Fatalf("重连失败: 设备锁")
default:
log.Errorf("重连失败: %v", rsp.ErrorMessage)
continue
}
}
log.Info("重连成功")
return
}
log.Fatal("重连失败: 重连次数达到设置的上限值")
}
b.Release()
log.Fatalf("Bot已离线:%v", e.Message)
})
c := make(chan os.Signal, 1)
b := server.WebServer.Run(fmt.Sprintf("%s:%d", "0.0.0.0", conf.WebUi.WebUiPort), cli)
c := server.Console
signal.Notify(c, os.Interrupt, os.Kill)
<-c
b.Release()
......
This diff is collapsed.
......@@ -5,6 +5,7 @@ import (
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
"net/http"
"os"
"strconv"
"strings"
......@@ -21,6 +22,7 @@ import (
type httpServer struct {
engine *gin.Engine
bot *coolq.CQBot
Http *http.Server
}
type httpClient struct {
......@@ -79,13 +81,23 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
go func() {
log.Infof("CQ HTTP 服务器已启动: %v", addr)
err := s.engine.Run(addr)
if err != nil {
s.Http=&http.Server{
Addr:addr,
Handler:s.engine,
}
if err := s.Http.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Error(err)
log.Infof("请检查端口是否被占用.")
time.Sleep(time.Second * 5)
os.Exit(1)
}
//err := s.engine.Run(addr)
//if err != nil {
// log.Error(err)
// log.Infof("请检查端口是否被占用.")
// time.Sleep(time.Second * 5)
// os.Exit(1)
//}
}()
}
......@@ -529,3 +541,16 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){
s.GetWordSlices(c)
},
}
func (s *httpServer) ShutDown() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := s.Http.Shutdown(ctx); err != nil {
log.Fatal("http Server Shutdown:", err)
}
select {
case <-ctx.Done():
log.Println("timeout of 5 seconds.")
}
log.Println("http Server exiting")
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment