@@ -103,10 +103,13 @@
103 103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
104 104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
msgTotal atomic.Int64
105 105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
106 106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
joinCh chan string
107 107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
client *girc.Client
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // RELAYMSG support detected from ISUPPORT.
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ relaySep string // separator (e.g. "/"), empty if unsupported
108 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
109 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
110 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// New creates a bridge Bot.
111 114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func New(ircAddr, nick, password string, channels []string, bufSize int, webUserTTL time.Duration, log *slog.Logger) *Bot {
112 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if nick == "" {
@@ -172,10 +175,22 @@
172 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
PingTimeout: 30 * time.Second,
173 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SSL: false,
174 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
})
175 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
176 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c.Handlers.AddBg(girc.CONNECTED, func(cl *girc.Client, _ girc.Event) {
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Check RELAYMSG support from ISUPPORT (RPL_005).
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if sep, ok := cl.GetServerOption("RELAYMSG"); ok && sep != "" {
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.relaySep = sep
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if b.log != nil {
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.log.Info("bridge: RELAYMSG supported", "separator", sep)
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.relaySep = ""
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if b.log != nil {
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.log.Info("bridge: RELAYMSG not supported, using [nick] prefix fallback")
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
177 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if b.log != nil {
178 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b.log.Info("bridge connected")
179 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
180 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for _, ch := range b.initChannels {
181 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cl.Cmd.Join(ch)
@@ -338,19 +353,27 @@
338 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
339 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
340 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// SendWithMeta sends a message to channel with optional structured metadata.
341 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// IRC receives only the plain text; SSE subscribers receive the full message
342 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// including meta for rich rendering in the web UI.
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ //
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // When the server supports RELAYMSG (IRCv3), messages are attributed natively
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // so other clients see the real sender nick. Falls back to [nick] prefix.
343 361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
func (b *Bot) SendWithMeta(ctx context.Context, channel, text, senderNick string, meta *Meta) error {
344 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if b.client == nil {
345 363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return fmt.Errorf("bridge: not connected")
346 364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ircText := text
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if senderNick != "" {
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ircText = "[" + senderNick + "] " + text
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if senderNick != "" && b.relaySep != "" {
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ // Use RELAYMSG for native attribution.
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.client.Cmd.SendRawf("RELAYMSG %s %s :%s", channel, senderNick, text)
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ircText := text
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if senderNick != "" {
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ircText = "[" + senderNick + "] " + text
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ b.client.Cmd.Message(channel, ircText)
350 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- b.client.Cmd.Message(channel, ircText)
352 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
353 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if senderNick != "" {
354 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
b.TouchUser(channel, senderNick)
355 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
356 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
357 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!