Quellcode durchsuchen

fix #1240

tags/v2.4.0-rc1
Shivaram Lingamneni vor 3 Jahren
Ursprung
Commit
498d76b131
2 geänderte Dateien mit 25 neuen und 26 gelöschten Zeilen
  1. 3
    19
      irc/handlers.go
  2. 22
    7
      irc/roleplay.go

+ 3
- 19
irc/handlers.go Datei anzeigen

2194
 	fakeSource := msg.Params[1]
2194
 	fakeSource := msg.Params[1]
2195
 	message := msg.Params[2:]
2195
 	message := msg.Params[2:]
2196
 
2196
 
2197
-	_, err := CasefoldName(fakeSource)
2198
-	if err != nil {
2199
-		client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname"))
2200
-		return false
2201
-	}
2202
-
2203
-	sourceString := fmt.Sprintf(npcNickMask, fakeSource, client.nick)
2204
-
2205
-	sendRoleplayMessage(server, client, sourceString, target, false, message, rb)
2197
+	sendRoleplayMessage(server, client, fakeSource, target, false, false, message, rb)
2206
 
2198
 
2207
 	return false
2199
 	return false
2208
 }
2200
 }
2212
 	target := msg.Params[0]
2204
 	target := msg.Params[0]
2213
 	fakeSource := msg.Params[1]
2205
 	fakeSource := msg.Params[1]
2214
 	message := msg.Params[2:]
2206
 	message := msg.Params[2:]
2215
-	sourceString := fmt.Sprintf(npcNickMask, fakeSource, client.nick)
2216
-
2217
-	_, err := CasefoldName(fakeSource)
2218
-	if err != nil {
2219
-		client.Send(nil, client.server.name, ERR_CANNOTSENDRP, target, client.t("Fake source must be a valid nickname"))
2220
-		return false
2221
-	}
2222
 
2207
 
2223
-	sendRoleplayMessage(server, client, sourceString, target, true, message, rb)
2208
+	sendRoleplayMessage(server, client, fakeSource, target, false, true, message, rb)
2224
 
2209
 
2225
 	return false
2210
 	return false
2226
 }
2211
 }
2623
 func sceneHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2608
 func sceneHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *ResponseBuffer) bool {
2624
 	target := msg.Params[0]
2609
 	target := msg.Params[0]
2625
 	message := msg.Params[1:]
2610
 	message := msg.Params[1:]
2626
-	sourceString := fmt.Sprintf(sceneNickMask, client.nick)
2627
 
2611
 
2628
-	sendRoleplayMessage(server, client, sourceString, target, false, message, rb)
2612
+	sendRoleplayMessage(server, client, "", target, true, false, message, rb)
2629
 
2613
 
2630
 	return false
2614
 	return false
2631
 }
2615
 }

+ 22
- 7
irc/roleplay.go Datei anzeigen

4
 package irc
4
 package irc
5
 
5
 
6
 import (
6
 import (
7
-	"bytes"
7
+	"fmt"
8
+	"strings"
8
 
9
 
9
 	"github.com/oragono/oragono/irc/history"
10
 	"github.com/oragono/oragono/irc/history"
10
 	"github.com/oragono/oragono/irc/modes"
11
 	"github.com/oragono/oragono/irc/modes"
16
 	sceneNickMask = "=Scene=!%s@npc.fakeuser.invalid"
17
 	sceneNickMask = "=Scene=!%s@npc.fakeuser.invalid"
17
 )
18
 )
18
 
19
 
19
-func sendRoleplayMessage(server *Server, client *Client, source string, targetString string, isAction bool, messageParts []string, rb *ResponseBuffer) {
20
+func sendRoleplayMessage(server *Server, client *Client, source string, targetString string, isScene, isAction bool, messageParts []string, rb *ResponseBuffer) {
20
 	config := server.Config()
21
 	config := server.Config()
21
 	if !config.Roleplay.Enabled {
22
 	if !config.Roleplay.Enabled {
22
 		rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, targetString, client.t("Roleplaying has been disabled by the server administrators"))
23
 		rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, targetString, client.t("Roleplaying has been disabled by the server administrators"))
27
 		return
28
 		return
28
 	}
29
 	}
29
 
30
 
31
+	var sourceMask string
32
+	if isScene {
33
+		sourceMask = fmt.Sprintf(sceneNickMask, client.Nick())
34
+	} else {
35
+		cfSource, cfSourceErr := CasefoldName(source)
36
+		skelSource, skelErr := Skeleton(source)
37
+		if cfSourceErr != nil || skelErr != nil ||
38
+			restrictedCasefoldedNicks.Has(cfSource) || restrictedSkeletons.Has(skelSource) {
39
+			rb.Add(nil, client.server.name, ERR_CANNOTSENDRP, targetString, client.t("Invalid roleplay name"))
40
+			return
41
+		}
42
+		sourceMask = fmt.Sprintf(npcNickMask, source, client.Nick())
43
+	}
44
+
30
 	// block attempts to send CTCP messages to Tor clients
45
 	// block attempts to send CTCP messages to Tor clients
31
 	if len(messageParts) > 0 && len(messageParts[0]) > 0 && messageParts[0][0] == '\x01' {
46
 	if len(messageParts) > 0 && len(messageParts[0]) > 0 && messageParts[0][0] == '\x01' {
32
 		return
47
 		return
33
 	}
48
 	}
34
 
49
 
35
-	var buf bytes.Buffer
50
+	var buf strings.Builder
36
 	if isAction {
51
 	if isAction {
37
 		buf.WriteString("\x01ACTION ")
52
 		buf.WriteString("\x01ACTION ")
38
 	}
53
 	}
80
 				// of roleplay commands, so send them a copy whether they have echo-message
95
 				// of roleplay commands, so send them a copy whether they have echo-message
81
 				// or not
96
 				// or not
82
 				if rb.session == session {
97
 				if rb.session == session {
83
-					rb.AddSplitMessageFromClient(source, "", nil, "PRIVMSG", targetString, splitMessage)
98
+					rb.AddSplitMessageFromClient(sourceMask, "", nil, "PRIVMSG", targetString, splitMessage)
84
 				} else {
99
 				} else {
85
-					session.sendSplitMsgFromClientInternal(false, source, "*", nil, "PRIVMSG", targetString, splitMessage)
100
+					session.sendSplitMsgFromClientInternal(false, sourceMask, "*", nil, "PRIVMSG", targetString, splitMessage)
86
 				}
101
 				}
87
 			}
102
 			}
88
 		}
103
 		}
90
 		channel.AddHistoryItem(history.Item{
105
 		channel.AddHistoryItem(history.Item{
91
 			Type:    history.Privmsg,
106
 			Type:    history.Privmsg,
92
 			Message: splitMessage,
107
 			Message: splitMessage,
93
-			Nick:    source,
108
+			Nick:    sourceMask,
94
 		}, client.Account())
109
 		}, client.Account())
95
 	} else {
110
 	} else {
96
 		target, err := CasefoldName(targetString)
111
 		target, err := CasefoldName(targetString)
108
 		cnick := client.Nick()
123
 		cnick := client.Nick()
109
 		tnick := user.Nick()
124
 		tnick := user.Nick()
110
 		for _, session := range user.Sessions() {
125
 		for _, session := range user.Sessions() {
111
-			session.sendSplitMsgFromClientInternal(false, source, "*", nil, "PRIVMSG", tnick, splitMessage)
126
+			session.sendSplitMsgFromClientInternal(false, sourceMask, "*", nil, "PRIVMSG", tnick, splitMessage)
112
 		}
127
 		}
113
 		if away, awayMessage := user.Away(); away {
128
 		if away, awayMessage := user.Away(); away {
114
 			//TODO(dan): possibly implement cooldown of away notifications to users
129
 			//TODO(dan): possibly implement cooldown of away notifications to users

Laden…
Abbrechen
Speichern