rewrite chat commands into args processor

This commit is contained in:
wish
2023-07-23 16:24:41 +10:00
parent 19e1eae5e2
commit 478e5230cc
2 changed files with 69 additions and 87 deletions

View File

@@ -70,31 +70,31 @@
{ {
"Name": "Rights", "Name": "Rights",
"Enabled": false, "Enabled": false,
"Prefix": "!rights" "Prefix": "rights"
}, { }, {
"Name": "Raviente", "Name": "Raviente",
"Enabled": true, "Enabled": true,
"Prefix": "!ravi" "Prefix": "ravi"
}, { }, {
"Name": "Teleport", "Name": "Teleport",
"Enabled": false, "Enabled": false,
"Prefix": "!tele" "Prefix": "tele"
}, { }, {
"Name": "Reload", "Name": "Reload",
"Enabled": true, "Enabled": true,
"Prefix": "!reload" "Prefix": "reload"
}, { }, {
"Name": "KeyQuest", "Name": "KeyQuest",
"Enabled": false, "Enabled": false,
"Prefix": "!kqf" "Prefix": "kqf"
}, { }, {
"Name": "Course", "Name": "Course",
"Enabled": true, "Enabled": true,
"Prefix": "!course" "Prefix": "course"
}, { }, {
"Name": "PSN", "Name": "PSN",
"Enabled": true, "Enabled": true,
"Prefix": "!psn" "Prefix": "psn"
} }
], ],
"Courses": [ "Courses": [

View File

@@ -11,6 +11,7 @@ import (
"fmt" "fmt"
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
"math" "math"
"strconv"
"strings" "strings"
"time" "time"
@@ -82,23 +83,22 @@ func sendServerChatMessage(s *Session, message string) {
} }
func parseChatCommand(s *Session, command string) { func parseChatCommand(s *Session, command string) {
if strings.HasPrefix(command, commands["PSN"].Prefix) { args := strings.Split(command[1:], " ")
switch args[0] {
case commands["PSN"].Prefix:
if commands["PSN"].Enabled { if commands["PSN"].Enabled {
var id string if len(args) > 1 {
n, err := fmt.Sscanf(command, fmt.Sprintf("%s %%s", commands["PSN"].Prefix), &id) _, err := s.server.db.Exec(`UPDATE users u SET psn_id=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)`, args[1], s.charID)
if err != nil || n != 1 {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandPSNError"], commands["PSN"].Prefix))
} else {
_, err = s.server.db.Exec(`UPDATE users u SET psn_id=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)`, id, s.charID)
if err == nil { if err == nil {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandPSNSuccess"], id)) sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandPSNSuccess"], args[1]))
} }
} else {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandPSNError"], commands["PSN"].Prefix))
} }
} else {
sendDisabledCommandMessage(s, commands["PSN"])
} }
} case commands["Reload"].Prefix:
if strings.HasPrefix(command, commands["Reload"].Prefix) {
// Flush all objects and users and reload
if commands["Reload"].Enabled { if commands["Reload"].Enabled {
sendServerChatMessage(s, s.server.dict["commandReload"]) sendServerChatMessage(s, s.server.dict["commandReload"])
var temp mhfpacket.MHFPacket var temp mhfpacket.MHFPacket
@@ -159,64 +159,53 @@ func parseChatCommand(s *Session, command string) {
} else { } else {
sendDisabledCommandMessage(s, commands["Reload"]) sendDisabledCommandMessage(s, commands["Reload"])
} }
} case commands["KeyQuest"].Prefix:
if strings.HasPrefix(command, commands["KeyQuest"].Prefix) {
if commands["KeyQuest"].Enabled { if commands["KeyQuest"].Enabled {
if strings.HasPrefix(command, fmt.Sprintf("%s get", commands["KeyQuest"].Prefix)) { if len(args) > 1 {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandKqfGet"], s.kqf)) if args[1] == "get" {
} else if strings.HasPrefix(command, fmt.Sprintf("%s set", commands["KeyQuest"].Prefix)) { sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandKqfGet"], s.kqf))
var hexs string } else if args[1] == "set" {
n, numerr := fmt.Sscanf(command, fmt.Sprintf("%s set %%s", commands["KeyQuest"].Prefix), &hexs) if len(args) > 2 && len(args[2]) == 16 {
if numerr != nil || n != 1 || len(hexs) != 16 { hexd, _ := hex.DecodeString(args[2])
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandKqfSetError"], commands["KeyQuest"].Prefix)) s.kqf = hexd
} else { s.kqfOverride = true
hexd, _ := hex.DecodeString(hexs) sendServerChatMessage(s, s.server.dict["commandKqfSetSuccess"])
s.kqf = hexd } else {
s.kqfOverride = true sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandKqfSetError"], commands["KeyQuest"].Prefix))
sendServerChatMessage(s, s.server.dict["commandKqfSetSuccess"]) }
} }
} }
} else { } else {
sendDisabledCommandMessage(s, commands["KeyQuest"]) sendDisabledCommandMessage(s, commands["KeyQuest"])
} }
} case commands["Rights"].Prefix:
if strings.HasPrefix(command, commands["Rights"].Prefix) {
// Set account rights
if commands["Rights"].Enabled { if commands["Rights"].Enabled {
var v uint32 if len(args) > 1 {
n, err := fmt.Sscanf(command, fmt.Sprintf("%s %%d", commands["Rights"].Prefix), &v) v, _ := strconv.Atoi(args[1])
if err != nil || n != 1 { _, err := s.server.db.Exec("UPDATE users u SET rights=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", v, s.charID)
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRightsError"], commands["Rights"].Prefix))
} else {
_, err = s.server.db.Exec("UPDATE users u SET rights=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", v, s.charID)
if err == nil { if err == nil {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRightsSuccess"], v)) sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRightsSuccess"], v))
} else {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRightsError"], commands["Rights"].Prefix))
} }
} else {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRightsError"], commands["Rights"].Prefix))
} }
} else { } else {
sendDisabledCommandMessage(s, commands["Rights"]) sendDisabledCommandMessage(s, commands["Rights"])
} }
} case commands["Course"].Prefix:
if strings.HasPrefix(command, commands["Course"].Prefix) {
if commands["Course"].Enabled { if commands["Course"].Enabled {
var name string if len(args) > 1 {
n, err := fmt.Sscanf(command, fmt.Sprintf("%s %%s", commands["Course"].Prefix), &name)
if err != nil || n != 1 {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandCourseError"], commands["Course"].Prefix))
} else {
name = strings.ToLower(name)
for _, course := range mhfcourse.Courses() { for _, course := range mhfcourse.Courses() {
for _, alias := range course.Aliases() { for _, alias := range course.Aliases() {
if strings.ToLower(name) == strings.ToLower(alias) { if strings.ToLower(args[1]) == strings.ToLower(alias) {
if slices.Contains(s.server.erupeConfig.Courses, _config.Course{Name: course.Aliases()[0], Enabled: true}) { if slices.Contains(s.server.erupeConfig.Courses, _config.Course{Name: course.Aliases()[0], Enabled: true}) {
var delta, rightsInt uint32 var delta, rightsInt uint32
if mhfcourse.CourseExists(course.ID, s.courses) { if mhfcourse.CourseExists(course.ID, s.courses) {
ei := slices.IndexFunc(s.courses, func(c mhfcourse.Course) bool { ei := slices.IndexFunc(s.courses, func(c mhfcourse.Course) bool {
for _, alias := range c.Aliases() { for _, alias := range c.Aliases() {
if strings.ToLower(name) == strings.ToLower(alias) { if strings.ToLower(args[1]) == strings.ToLower(alias) {
return true return true
} }
} }
@@ -230,7 +219,7 @@ func parseChatCommand(s *Session, command string) {
delta = uint32(math.Pow(2, float64(course.ID))) delta = uint32(math.Pow(2, float64(course.ID)))
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandCourseEnabled"], course.Aliases()[0])) sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandCourseEnabled"], course.Aliases()[0]))
} }
err = s.server.db.QueryRow("SELECT rights FROM users u INNER JOIN characters c ON u.id = c.user_id WHERE c.id = $1", s.charID).Scan(&rightsInt) err := s.server.db.QueryRow("SELECT rights FROM users u INNER JOIN characters c ON u.id = c.user_id WHERE c.id = $1", s.charID).Scan(&rightsInt)
if err == nil { if err == nil {
s.server.db.Exec("UPDATE users u SET rights=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", rightsInt+delta, s.charID) s.server.db.Exec("UPDATE users u SET rights=$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", rightsInt+delta, s.charID)
} }
@@ -242,21 +231,18 @@ func parseChatCommand(s *Session, command string) {
} }
} }
} }
} else {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandCourseError"], commands["Course"].Prefix)) sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandCourseError"], commands["Course"].Prefix))
} }
} else { } else {
sendDisabledCommandMessage(s, commands["Course"]) sendDisabledCommandMessage(s, commands["Course"])
} }
} case commands["Raviente"].Prefix:
if strings.HasPrefix(command, commands["Raviente"].Prefix) {
if commands["Raviente"].Enabled { if commands["Raviente"].Enabled {
if getRaviSemaphore(s.server) != nil { if len(args) > 1 {
s.server.raviente.Lock() if getRaviSemaphore(s.server) != nil {
if !strings.HasPrefix(command, "!ravi ") { switch args[1] {
sendServerChatMessage(s, s.server.dict["commandRaviNoCommand"]) case "start":
} else {
if strings.HasPrefix(command, "!ravi start") {
if s.server.raviente.register.startTime == 0 { if s.server.raviente.register.startTime == 0 {
s.server.raviente.register.startTime = s.server.raviente.register.postTime s.server.raviente.register.startTime = s.server.raviente.register.postTime
sendServerChatMessage(s, s.server.dict["commandRaviStartSuccess"]) sendServerChatMessage(s, s.server.dict["commandRaviStartSuccess"])
@@ -264,60 +250,56 @@ func parseChatCommand(s *Session, command string) {
} else { } else {
sendServerChatMessage(s, s.server.dict["commandRaviStartError"]) sendServerChatMessage(s, s.server.dict["commandRaviStartError"])
} }
} else if strings.HasPrefix(command, "!ravi cm") || strings.HasPrefix(command, "!ravi checkmultiplier") { case "cm", "check", "checkmultiplier", "multiplier":
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRaviMultiplier"], s.server.raviente.GetRaviMultiplier(s.server))) sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandRaviMultiplier"], s.server.raviente.GetRaviMultiplier(s.server)))
} else if strings.HasPrefix(command, "!ravi sr") || strings.HasPrefix(command, "!ravi sendres") { case "sr", "sendres", "resurrection":
if s.server.raviente.state.stateData[28] > 0 { if s.server.raviente.state.stateData[28] > 0 {
sendServerChatMessage(s, s.server.dict["commandRaviResSuccess"]) sendServerChatMessage(s, s.server.dict["commandRaviResSuccess"])
s.server.raviente.state.stateData[28] = 0 s.server.raviente.state.stateData[28] = 0
} else { } else {
sendServerChatMessage(s, s.server.dict["commandRaviResError"]) sendServerChatMessage(s, s.server.dict["commandRaviResError"])
} }
} else if strings.HasPrefix(command, "!ravi ss") || strings.HasPrefix(command, "!ravi sendsed") { case "ss", "sendsed":
sendServerChatMessage(s, s.server.dict["commandRaviSedSuccess"]) sendServerChatMessage(s, s.server.dict["commandRaviSedSuccess"])
// Total BerRavi HP // Total BerRavi HP
HP := s.server.raviente.state.stateData[0] + s.server.raviente.state.stateData[1] + s.server.raviente.state.stateData[2] + s.server.raviente.state.stateData[3] + s.server.raviente.state.stateData[4] HP := s.server.raviente.state.stateData[0] + s.server.raviente.state.stateData[1] + s.server.raviente.state.stateData[2] + s.server.raviente.state.stateData[3] + s.server.raviente.state.stateData[4]
s.server.raviente.support.supportData[1] = HP s.server.raviente.support.supportData[1] = HP
} else if strings.HasPrefix(command, "!ravi rs") || strings.HasPrefix(command, "!ravi reqsed") { case "rs", "reqsed":
sendServerChatMessage(s, s.server.dict["commandRaviRequest"]) sendServerChatMessage(s, s.server.dict["commandRaviRequest"])
// Total BerRavi HP // Total BerRavi HP
HP := s.server.raviente.state.stateData[0] + s.server.raviente.state.stateData[1] + s.server.raviente.state.stateData[2] + s.server.raviente.state.stateData[3] + s.server.raviente.state.stateData[4] HP := s.server.raviente.state.stateData[0] + s.server.raviente.state.stateData[1] + s.server.raviente.state.stateData[2] + s.server.raviente.state.stateData[3] + s.server.raviente.state.stateData[4]
s.server.raviente.support.supportData[1] = HP + 12 s.server.raviente.support.supportData[1] = HP + 12
} else { default:
sendServerChatMessage(s, s.server.dict["commandRaviError"]) sendServerChatMessage(s, s.server.dict["commandRaviError"])
} }
} else {
sendServerChatMessage(s, s.server.dict["commandRaviNoPlayers"])
} }
s.server.raviente.Unlock()
} else { } else {
sendServerChatMessage(s, s.server.dict["commandRaviNoPlayers"]) sendServerChatMessage(s, s.server.dict["commandRaviError"])
} }
} else { } else {
sendDisabledCommandMessage(s, commands["Raviente"]) sendDisabledCommandMessage(s, commands["Raviente"])
} }
} case commands["Teleport"].Prefix:
if strings.HasPrefix(command, commands["Teleport"].Prefix) {
if commands["Teleport"].Enabled { if commands["Teleport"].Enabled {
var x, y int16 if len(args) > 2 {
n, err := fmt.Sscanf(command, fmt.Sprintf("%s %%d %%d", commands["Teleport"].Prefix), &x, &y) x, _ := strconv.Atoi(args[1])
if err != nil || n != 2 { y, _ := strconv.Atoi(args[2])
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandTeleportError"], commands["Teleport"].Prefix))
} else {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandTeleportSuccess"], x, y))
// Make the inside of the casted binary
payload := byteframe.NewByteFrame() payload := byteframe.NewByteFrame()
payload.SetLE() payload.SetLE()
payload.WriteUint8(2) // SetState type(position == 2) payload.WriteUint8(2) // SetState type(position == 2)
payload.WriteInt16(x) // X payload.WriteInt16(int16(x)) // X
payload.WriteInt16(y) // Y payload.WriteInt16(int16(y)) // Y
payloadBytes := payload.Data() payloadBytes := payload.Data()
s.QueueSendMHF(&mhfpacket.MsgSysCastedBinary{ s.QueueSendMHF(&mhfpacket.MsgSysCastedBinary{
CharID: s.charID, CharID: s.charID,
MessageType: BinaryMessageTypeState, MessageType: BinaryMessageTypeState,
RawDataPayload: payloadBytes, RawDataPayload: payloadBytes,
}) })
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandTeleportSuccess"], x, y))
} else {
sendServerChatMessage(s, fmt.Sprintf(s.server.dict["commandTeleportError"], commands["Teleport"].Prefix))
} }
} else { } else {
sendDisabledCommandMessage(s, commands["Teleport"]) sendDisabledCommandMessage(s, commands["Teleport"])