From 1ea81e7242098eb321c098991efb259683f72984 Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Mon, 18 Nov 2024 16:34:40 -0800 Subject: [PATCH] Send event when user fails to create a match --- PROTOCOL.md | 3 +++ command.go | 41 +++++++++++++++---------------- event.go | 7 ++++++ pkg/server/client.go | 4 ++++ pkg/server/locales/bgammon.pot | 7 ++++-- pkg/server/server_command.go | 44 ++++++++++++++++++---------------- 6 files changed, 64 insertions(+), 42 deletions(-) diff --git a/PROTOCOL.md b/PROTOCOL.md index 5ef1e05..b96d3c0 100644 --- a/PROTOCOL.md +++ b/PROTOCOL.md @@ -197,6 +197,9 @@ This document lists events in human-readable format. - `listend End of matches list.` - End of matches list. +- `failedcreate ` + - Sent after failing to create a match. + - `joined ` - Sent after successfully creating or joining a match, and when another player joins a match you are in. diff --git a/command.go b/command.go index b39d834..7716e50 100644 --- a/command.go +++ b/command.go @@ -43,26 +43,27 @@ const ( type EventType string const ( - EventTypeWelcome = "welcome" - EventTypeHelp = "help" - EventTypePing = "ping" - EventTypeNotice = "notice" - EventTypeSay = "say" - EventTypeList = "list" - EventTypeJoined = "joined" - EventTypeFailedJoin = "failedjoin" - EventTypeLeft = "left" - EventTypeFailedLeave = "failedleave" - EventTypeBoard = "board" - EventTypeRolled = "rolled" - EventTypeFailedRoll = "failedroll" - EventTypeMoved = "moved" - EventTypeFailedMove = "failedmove" - EventTypeFailedOk = "failedok" - EventTypeWin = "win" - EventTypeSettings = "settings" - EventTypeReplay = "replay" - EventTypeHistory = "history" + EventTypeWelcome = "welcome" + EventTypeHelp = "help" + EventTypePing = "ping" + EventTypeNotice = "notice" + EventTypeSay = "say" + EventTypeList = "list" + EventTypeFailedCreate = "failedcreate" + EventTypeJoined = "joined" + EventTypeFailedJoin = "failedjoin" + EventTypeLeft = "left" + EventTypeFailedLeave = "failedleave" + EventTypeBoard = "board" + EventTypeRolled = "rolled" + EventTypeFailedRoll = "failedroll" + EventTypeMoved = "moved" + EventTypeFailedMove = "failedmove" + EventTypeFailedOk = "failedok" + EventTypeWin = "win" + EventTypeSettings = "settings" + EventTypeReplay = "replay" + EventTypeHistory = "history" ) var HelpText = map[string]string{ diff --git a/event.go b/event.go index c3f9c9b..352fb32 100644 --- a/event.go +++ b/event.go @@ -53,6 +53,11 @@ type EventList struct { Games []GameListing } +type EventFailedCreate struct { + Event + Reason string +} + type EventJoined struct { Event GameID int @@ -178,6 +183,8 @@ func DecodeEvent(message []byte) (interface{}, error) { ev = &EventSay{} case EventTypeList: ev = &EventList{} + case EventTypeFailedCreate: + ev = &EventFailedCreate{} case EventTypeJoined: ev = &EventJoined{} case EventTypeFailedJoin: diff --git a/pkg/server/client.go b/pkg/server/client.go index a9a488d..229f152 100644 --- a/pkg/server/client.go +++ b/pkg/server/client.go @@ -108,6 +108,8 @@ func (c *serverClient) sendEvent(e interface{}) { ev.Type = bgammon.EventTypeSay case *bgammon.EventList: ev.Type = bgammon.EventTypeList + case *bgammon.EventFailedCreate: + ev.Type = bgammon.EventTypeFailedCreate case *bgammon.EventJoined: ev.Type = bgammon.EventTypeJoined case *bgammon.EventFailedJoin: @@ -189,6 +191,8 @@ func (c *serverClient) sendEvent(e interface{}) { c.Write([]byte(fmt.Sprintf("game %d %d %d %d %s", g.ID, password, g.Points, g.Players, name))) } c.Write([]byte("listend End of matches list.")) + case *bgammon.EventFailedCreate: + c.Write([]byte(fmt.Sprintf("failedcreate %s", ev.Reason))) case *bgammon.EventJoined: c.Write([]byte(fmt.Sprintf("joined %d %d %s", ev.GameID, ev.PlayerNumber, ev.Player))) case *bgammon.EventFailedJoin: diff --git a/pkg/server/locales/bgammon.pot b/pkg/server/locales/bgammon.pot index 0c5673e..bbe0655 100644 --- a/pkg/server/locales/bgammon.pot +++ b/pkg/server/locales/bgammon.pot @@ -76,10 +76,13 @@ msgstr "" msgid "Failed to change password: you are logged in as a guest." msgstr "" -msgid "Failed to create match: Please leave the match you are in before creating another." +msgid "Failed to create match: %s" msgstr "" -msgid "Failed to create match: The server is shutting down. Reason: %s" +msgid "Please leave the match you are in before creating another." +msgstr "" + +msgid "The server is shutting down. Reason: %s" msgstr "" msgid "Failed to log in: %s" diff --git a/pkg/server/server_command.go b/pkg/server/server_command.go index d69b836..0c14c22 100644 --- a/pkg/server/server_command.go +++ b/pkg/server/server_command.go @@ -432,24 +432,28 @@ COMMANDS: case bgammon.CommandList, "ls": s.sendMatchList(cmd.client) case bgammon.CommandCreate, "c": + failCreate := func(message string) { + cmd.client.sendEvent(&bgammon.EventFailedCreate{ + Reason: message, + }) + // TODO Remove when most users are running Boxcars v1.4.7+ + cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Failed to create match: %s", message)) + } + sendUsage := func() { + failCreate("To create a public match please specify whether it is public or private, and also specify how many points are needed to win the match. When creating a private match, a password must also be provided.") + } + if clientGame != nil { - cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Failed to create match: Please leave the match you are in before creating another.")) + failCreate(gotext.GetD(cmd.client.language, "Please leave the match you are in before creating another.")) continue } else if !s.shutdownTime.IsZero() { - cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Failed to create match: The server is shutting down. Reason: %s", s.shutdownReason)) + failCreate(gotext.GetD(cmd.client.language, "The server is shutting down. Reason: %s", s.shutdownReason)) continue - } - - sendUsage := func() { - cmd.client.sendNotice("To create a public match please specify whether it is public or private, and also specify how many points are needed to win the match. When creating a private match, a password must also be provided.") - } - if len(params) < 2 { + } else if len(params) < 2 { sendUsage() continue - } - - if s.defcon < 3 && cmd.client.accountID == 0 { - cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Due to ongoing abuse, some actions are restricted to registered users only. Please log in or register to avoid interruptions.")) + } else if s.defcon < 3 && cmd.client.accountID == 0 { + failCreate(gotext.GetD(cmd.client.language, "Due to ongoing abuse, some actions are restricted to registered users only. Please log in or register to avoid interruptions.")) continue } @@ -714,7 +718,7 @@ COMMANDS: clientGame.Winner = opponent.playerNumber clientGame.NextPartialTurn(opponent.playerNumber) - // TODO Remove when most users are running Boxcars v1.4.7+ + // TODO Remove when most users are running Boxcars v1.4.6+ cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Declined double offer.")) clientGame.opponent(cmd.client).sendNotice(fmt.Sprintf(gotext.GetD(clientGame.opponent(cmd.client).language, "%s declined double offer."), cmd.client.name)) @@ -726,7 +730,7 @@ COMMANDS: clientGame.Winner = opponent.playerNumber clientGame.NextPartialTurn(opponent.playerNumber) - // TODO Remove when most users are running Boxcars v1.4.7+ + // TODO Remove when most users are running Boxcars v1.4.6+ cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Resigned.")) clientGame.opponent(cmd.client).sendNotice(fmt.Sprintf(gotext.GetD(clientGame.opponent(cmd.client).language, "%s resigned."), cmd.client.name)) @@ -1169,7 +1173,7 @@ COMMANDS: cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Your opponent left the match.")) continue } else if !s.shutdownTime.IsZero() { - cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Failed to create match: The server is shutting down. Reason: %s", s.shutdownReason)) + cmd.client.sendNotice(gotext.GetD(cmd.client.language, "Failed to create match: %s", gotext.GetD(cmd.client.language, "The server is shutting down. Reason: %s", s.shutdownReason))) continue } else if clientGame.rematch != 0 && clientGame.rematch != cmd.client.playerNumber { s.gamesLock.Lock() @@ -1680,13 +1684,13 @@ COMMANDS: } clientGame.Turn = 1 - clientGame.Roll1 = 1 - clientGame.Roll2 = 2 + clientGame.Roll1 = 5 + clientGame.Roll2 = 5 clientGame.Roll3 = 0 - clientGame.Variant = 1 - clientGame.Player1.Entered = true + clientGame.Variant = bgammon.VariantAceyDeucey + clientGame.Player1.Entered = false clientGame.Player2.Entered = true - clientGame.Board = []int8{0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -3, 0, 0, -3, -6, -2, 0, 0, 0} + clientGame.Board = []int8{1, 2, 1, 3, 2, 2, 2, 0, 0, 0, -3, -7, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, -3, 0, 0, -2} log.Println(clientGame.Board[0:28])