aboutsummaryrefslogtreecommitdiff
path: root/hotline
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2022-11-19 12:36:57 -0800
committerJeff Halter <868228+jhalter@users.noreply.github.com>2022-11-19 12:36:57 -0800
commit2e43fd4e1ec1f5e5920826126fc0f39a10d9282f (patch)
treef912f897c500f3aa7fa06c381345e82bbc289047 /hotline
parent745a1a1f23341740e19b02fcaf7c41d9c056aa7e (diff)
Improve Gtkhx compatability
Diffstat (limited to 'hotline')
-rw-r--r--hotline/transaction_handlers.go5
-rw-r--r--hotline/transaction_handlers_test.go64
2 files changed, 66 insertions, 3 deletions
diff --git a/hotline/transaction_handlers.go b/hotline/transaction_handlers.go
index 6816456..7f8cbef 100644
--- a/hotline/transaction_handlers.go
+++ b/hotline/transaction_handlers.go
@@ -248,8 +248,9 @@ func HandleChatSend(cc *ClientConn, t *Transaction) (res []Transaction, err erro
// By holding the option key, Hotline chat allows users to send /me formatted messages like:
// *** Halcyon does stuff
- // This is indicated by the presence of the optional field fieldChatOptions in the transaction payload
- if t.GetField(fieldChatOptions).Data != nil {
+ // This is indicated by the presence of the optional field fieldChatOptions set to a value of 1.
+ // Most clients do not send this option for normal chat messages.
+ if t.GetField(fieldChatOptions).Data != nil && bytes.Equal(t.GetField(fieldChatOptions).Data, []byte{0, 1}) {
formattedMsg = fmt.Sprintf("\r*** %s %s", cc.UserName, t.GetField(fieldData).Data)
}
diff --git a/hotline/transaction_handlers_test.go b/hotline/transaction_handlers_test.go
index 8898594..663c622 100644
--- a/hotline/transaction_handlers_test.go
+++ b/hotline/transaction_handlers_test.go
@@ -459,7 +459,7 @@ func TestHandleChatSend(t *testing.T) {
wantErr: false,
},
{
- name: "sends chat msg as emote if fieldChatOptions is set",
+ name: "sends chat msg as emote if fieldChatOptions is set to 1",
args: args{
cc: &ClientConn{
Account: &Account{
@@ -521,6 +521,68 @@ func TestHandleChatSend(t *testing.T) {
wantErr: false,
},
{
+ name: "does not send chat msg as emote if fieldChatOptions is set to 0",
+ args: args{
+ cc: &ClientConn{
+ Account: &Account{
+ Access: func() accessBitmap {
+ var bits accessBitmap
+ bits.Set(accessSendChat)
+ return bits
+ }(),
+ },
+ UserName: []byte("Testy McTest"),
+ Server: &Server{
+ Clients: map[uint16]*ClientConn{
+ uint16(1): {
+ Account: &Account{
+ Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
+ },
+ ID: &[]byte{0, 1},
+ },
+ uint16(2): {
+ Account: &Account{
+ Access: accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
+ },
+ ID: &[]byte{0, 2},
+ },
+ },
+ },
+ },
+ t: &Transaction{
+ Fields: []Field{
+ NewField(fieldData, []byte("hello")),
+ NewField(fieldChatOptions, []byte{0x00, 0x00}),
+ },
+ },
+ },
+ want: []Transaction{
+ {
+ clientID: &[]byte{0, 1},
+ Flags: 0x00,
+ IsReply: 0x00,
+ Type: []byte{0, 0x6a},
+ ID: []byte{0x9a, 0xcb, 0x04, 0x42},
+ ErrorCode: []byte{0, 0, 0, 0},
+ Fields: []Field{
+ NewField(fieldData, []byte("\r Testy McTest: hello")),
+ },
+ },
+ {
+ clientID: &[]byte{0, 2},
+ Flags: 0x00,
+ IsReply: 0x00,
+ Type: []byte{0, 0x6a},
+ ID: []byte{0xf0, 0xc5, 0x34, 0x1e},
+ ErrorCode: []byte{0, 0, 0, 0},
+ Fields: []Field{
+ NewField(fieldData, []byte("\r Testy McTest: hello")),
+ },
+ },
+ },
+ wantErr: false,
+ },
+ {
name: "only sends chat msg to clients with accessReadChat permission",
args: args{
cc: &ClientConn{