From 7b8a75208b034d5454b0cc5fbc3cd439b2071274 Mon Sep 17 00:00:00 2001 From: a3510377 Date: Thu, 16 May 2024 22:06:28 +0800 Subject: [PATCH] feat DEFAULT_MODE --- server/discord/discord.go | 22 ++++++++ server/discord/event.go | 26 +++++++++ server/discord/intent.go | 11 ++++ server/go.mod | 2 + server/go.sum | 10 ++++ server/hooks/hooks.go | 9 ++++ server/hooks/types.go | 7 +++ server/main.go | 19 +++++-- server/mode/error.go | 5 ++ server/mode/mode.go | 95 +++++++++++++++++++++++++++++++++ server/model/version.go | 7 +++ server/pkg/database/database.go | 2 +- server/router/router.go | 1 + 13 files changed, 212 insertions(+), 4 deletions(-) create mode 100644 server/discord/discord.go create mode 100644 server/discord/event.go create mode 100644 server/discord/intent.go create mode 100644 server/hooks/hooks.go create mode 100644 server/hooks/types.go create mode 100644 server/mode/error.go create mode 100644 server/mode/mode.go create mode 100644 server/model/version.go create mode 100644 server/router/router.go diff --git a/server/discord/discord.go b/server/discord/discord.go new file mode 100644 index 0000000..26d4efe --- /dev/null +++ b/server/discord/discord.go @@ -0,0 +1,22 @@ +package discord + +import "github.com/bwmarrin/discordgo" + +type DiscordClient struct { + *discordgo.Session +} + +func NewDiscordClient(token string) (*DiscordClient, error) { + client, err := discordgo.New(token) + if err != nil { + return nil, err + } + + client.Identify.Intents = makeIntentFlags( + discordgo.IntentsGuildMembers, + discordgo.IntentsGuildMessages, + discordgo.IntentsMessageContent, + ) + + return &DiscordClient{client}, nil +} diff --git a/server/discord/event.go b/server/discord/event.go new file mode 100644 index 0000000..28814bc --- /dev/null +++ b/server/discord/event.go @@ -0,0 +1,26 @@ +package discord + +import "github.com/bwmarrin/discordgo" + +func messageCreateEvent(s *discordgo.Session, m *discordgo.MessageCreate) { + if m.Author.ID == s.State.User.ID { + return + } + s.ChannelMessageSend(m.ChannelID, m.Content) +} + +func archiveReleaseHandler(s *discordgo.Session, m *discordgo.MessageCreate) { + if m.ChannelID != "" { + return + } + + if reference := m.Reference(); reference != nil { + referenceMsg, err := s.ChannelMessage(reference.ChannelID, reference.MessageID) + if err == nil { + s.ChannelMessageDelete(referenceMsg.ChannelID, referenceMsg.ID) + return + } + } + + // content := m.Content +} diff --git a/server/discord/intent.go b/server/discord/intent.go new file mode 100644 index 0000000..9e8cdc7 --- /dev/null +++ b/server/discord/intent.go @@ -0,0 +1,11 @@ +package discord + +import "github.com/bwmarrin/discordgo" + +func makeIntentFlags(intents ...discordgo.Intent) discordgo.Intent { + var result discordgo.Intent + for _, intent := range intents { + result |= intent + } + return result +} diff --git a/server/go.mod b/server/go.mod index 068d6aa..a47b646 100644 --- a/server/go.mod +++ b/server/go.mod @@ -5,6 +5,7 @@ go 1.22.0 toolchain go1.22.2 require ( + github.com/bwmarrin/discordgo v0.28.1 github.com/deckarep/golang-set/v2 v2.6.0 github.com/gin-gonic/gin v1.9.1 github.com/golang-jwt/jwt/v5 v5.2.1 @@ -19,6 +20,7 @@ require ( github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/cloudwego/base64x v0.1.3 // indirect github.com/cloudwego/iasm v0.2.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect github.com/kr/text v0.2.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/server/go.sum b/server/go.sum index 6686ca5..56e3458 100644 --- a/server/go.sum +++ b/server/go.sum @@ -1,3 +1,5 @@ +github.com/bwmarrin/discordgo v0.28.1 h1:gXsuo2GBO7NbR6uqmrrBDplPUx2T3nzu775q/Rd1aG4= +github.com/bwmarrin/discordgo v0.28.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bytedance/sonic v1.11.5 h1:G00FYjjqll5iQ1PYXynbg/hyzqBqavH8Mo9/oTopd9k= github.com/bytedance/sonic v1.11.5/go.mod h1:X2PC2giUdj/Cv2lliWFLk6c/DUQok5rViJSemeB0wDw= github.com/bytedance/sonic/loader v0.1.0/go.mod h1:UmRT+IRTGKz/DAkzcEGzyVqQFJ7H9BqwBO3pm9H/+HY= @@ -37,6 +39,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -86,20 +90,26 @@ github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/server/hooks/hooks.go b/server/hooks/hooks.go new file mode 100644 index 0000000..348e575 --- /dev/null +++ b/server/hooks/hooks.go @@ -0,0 +1,9 @@ +package hooks + +import "server/config" + +func New() *Service { + return &Service{ + Cfg: *config.Get(), + } +} diff --git a/server/hooks/types.go b/server/hooks/types.go new file mode 100644 index 0000000..0ba69e3 --- /dev/null +++ b/server/hooks/types.go @@ -0,0 +1,7 @@ +package hooks + +import "server/config" + +type Service struct { + Cfg config.Config +} diff --git a/server/main.go b/server/main.go index 2084eb8..f3d54dd 100644 --- a/server/main.go +++ b/server/main.go @@ -11,6 +11,8 @@ import ( "runtime" "server/api" "server/config" + "server/mode" + "server/model" "server/utils" "strings" "syscall" @@ -24,12 +26,23 @@ import ( // GIT_COMMIT and GIT_BRANCH are set by the build script var ( - GIT_BRANCH string = "-" - GIT_COMMIT string = "0000000" + VERSION = "unknown" + GIT_COMMIT = "unknown" + BUILD_DATE = "unknown" + DEFAULT_MODE = mode.Dev ) func main() { - fmt.Printf("Server Version: %s (%s)\n", GIT_BRANCH, GIT_COMMIT) + versionInfo := model.VersionInfo{ + Commit: GIT_COMMIT, + Version: VERSION, + BuildDate: BUILD_DATE, + } + + fmt.Printf("Server Version %s-%s@%s\n", versionInfo.Version, versionInfo.Commit, versionInfo.BuildDate) + mode.SetDefaultMode(DEFAULT_MODE) + mode.Set(os.Getenv("MODE")) + fmt.Println("Server Running Mode:", mode.Get()) CONFIG_PATH := os.Getenv("CONFIG_PATH") if CONFIG_PATH == "" { diff --git a/server/mode/error.go b/server/mode/error.go new file mode 100644 index 0000000..3564003 --- /dev/null +++ b/server/mode/error.go @@ -0,0 +1,5 @@ +package mode + +import "errors" + +var ErrInvalidMode = errors.New("invalid mode") diff --git a/server/mode/mode.go b/server/mode/mode.go new file mode 100644 index 0000000..81bb720 --- /dev/null +++ b/server/mode/mode.go @@ -0,0 +1,95 @@ +package mode + +import ( + "strings" + + "github.com/gin-gonic/gin" +) + +const ( + // Dev is used for development + Dev = "dev" + // Prod is used for production + Prod = "prod" + // TestDev is used for testing + TestDev = "test_dev" + // Default mode +) + +var ( + defaultMode = Dev + mode = defaultMode +) + +// parseMode parses the mode +func parseMode(s string) (string, error) { + switch s := strings.ToLower(s); s { + case Dev, Prod, TestDev: + return s, nil + case "development": + return Dev, nil + case "release": + return Prod, nil + case "test": + return TestDev, nil + case "test-dev": + return TestDev, nil + default: + return "", ErrInvalidMode + } +} + +// Get returns the mode +func Get() string { + return mode +} + +// Set sets the mode +func Set(newMode string) { + if parseMode, err := parseMode(newMode); err == nil { + mode = parseMode + } else { + mode = defaultMode + } + + updateGinMode() +} + +// GetDefault returns the default mode +func GetDefault() string { + return defaultMode +} + +// SetDefaultMode sets the default mode +func SetDefaultMode(newDefaultMode string) { + if parseMode, err := parseMode(newDefaultMode); err == nil { + mode = parseMode + } else { + mode = defaultMode + } +} + +// IsDev returns true if the mode is Dev or TestDev +func IsDev() bool { + mode := Get() + + return mode == Dev || mode == TestDev +} + +// updateGinMode updates the gin mode +func updateGinMode() { + var mode string + + switch Get() { + case Dev: + mode = gin.DebugMode + case TestDev: + mode = gin.TestMode + case Prod: + mode = gin.ReleaseMode + default: + panic("unknown mode") + } + + gin.SetMode(mode) +} diff --git a/server/model/version.go b/server/model/version.go new file mode 100644 index 0000000..f8e4b78 --- /dev/null +++ b/server/model/version.go @@ -0,0 +1,7 @@ +package model + +type VersionInfo struct { + Version string `json:"version"` + BuildDate string `json:"build_date"` + Commit string `json:"commit"` +} diff --git a/server/pkg/database/database.go b/server/pkg/database/database.go index 2713b2f..47cdb84 100644 --- a/server/pkg/database/database.go +++ b/server/pkg/database/database.go @@ -11,6 +11,6 @@ type Model struct { UpdatedAt time.Time `json:"updated_at,omitempty"` } -func (m *Model) IDtoString() string { +func (m *Model) StringID() string { return strconv.Itoa(int(m.ID)) } diff --git a/server/router/router.go b/server/router/router.go new file mode 100644 index 0000000..7ef135b --- /dev/null +++ b/server/router/router.go @@ -0,0 +1 @@ +package router