|
@ -85,6 +85,30 @@ func (client *Client) Context() context.Context { |
|
|
return client.ctx |
|
|
return client.ctx |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Nick gets the nick of the client
|
|
|
|
|
|
func (client *Client) Nick() string { |
|
|
|
|
|
client.mutex.RLock() |
|
|
|
|
|
defer client.mutex.RUnlock() |
|
|
|
|
|
|
|
|
|
|
|
return client.nick |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// User gets the user/ident of the client
|
|
|
|
|
|
func (client *Client) User() string { |
|
|
|
|
|
client.mutex.RLock() |
|
|
|
|
|
defer client.mutex.RUnlock() |
|
|
|
|
|
|
|
|
|
|
|
return client.user |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Host gets the hostname of the client
|
|
|
|
|
|
func (client *Client) Host() string { |
|
|
|
|
|
client.mutex.RLock() |
|
|
|
|
|
defer client.mutex.RUnlock() |
|
|
|
|
|
|
|
|
|
|
|
return client.host |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// ISupport gets the client's ISupport. This is mutable, and changes to it
|
|
|
// ISupport gets the client's ISupport. This is mutable, and changes to it
|
|
|
// *will* affect the client.
|
|
|
// *will* affect the client.
|
|
|
func (client *Client) ISupport() *isupport.ISupport { |
|
|
func (client *Client) ISupport() *isupport.ISupport { |
|
@ -133,6 +157,13 @@ func (client *Client) Connect(addr string, ssl bool) (err error) { |
|
|
break |
|
|
break |
|
|
} |
|
|
} |
|
|
line = replacer.Replace(line) |
|
|
line = replacer.Replace(line) |
|
|
|
|
|
|
|
|
|
|
|
event, err := ParsePacket(line) |
|
|
|
|
|
if err != nil { |
|
|
|
|
|
continue |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
client.Emit(event) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
client.mutex.Lock() |
|
|
client.mutex.Lock() |
|
@ -408,7 +439,7 @@ func (client *Client) handleEvent(event *Event) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
switch event.Name() { |
|
|
|
|
|
|
|
|
switch event.name { |
|
|
|
|
|
|
|
|
// Ping Pong
|
|
|
// Ping Pong
|
|
|
case "hook.tick": |
|
|
case "hook.tick": |
|
@ -457,10 +488,10 @@ func (client *Client) handleEvent(event *Event) { |
|
|
case "packet.001": |
|
|
case "packet.001": |
|
|
{ |
|
|
{ |
|
|
client.mutex.Lock() |
|
|
client.mutex.Lock() |
|
|
client.nick = event.Args[1] |
|
|
|
|
|
|
|
|
client.nick = event.Args[0] |
|
|
client.mutex.Unlock() |
|
|
client.mutex.Unlock() |
|
|
|
|
|
|
|
|
client.Sendf("WHO %s", event.Args[1]) |
|
|
|
|
|
|
|
|
client.Sendf("WHO %s", event.Args[0]) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
case "packet.443": |
|
|
case "packet.443": |
|
@ -474,17 +505,21 @@ func (client *Client) handleEvent(event *Event) { |
|
|
|
|
|
|
|
|
// "AltN" -> "AltN+1", ...
|
|
|
// "AltN" -> "AltN+1", ...
|
|
|
prev := client.config.Nick |
|
|
prev := client.config.Nick |
|
|
|
|
|
sent := false |
|
|
for _, alt := range client.config.Alternatives { |
|
|
for _, alt := range client.config.Alternatives { |
|
|
if nick == prev { |
|
|
if nick == prev { |
|
|
client.Sendf("NICK %s", nick) |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
client.Sendf("NICK %s", alt) |
|
|
|
|
|
sent = true |
|
|
|
|
|
break |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
prev = alt |
|
|
prev = alt |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if !sent { |
|
|
// "LastAlt" -> "Nick23962"
|
|
|
// "LastAlt" -> "Nick23962"
|
|
|
client.Sendf("%s%05d", client.config.Nick, mathRand.Int31n(99999)) |
|
|
|
|
|
|
|
|
client.Sendf("NICK %s%05d", client.config.Nick, mathRand.Int31n(99999)) |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -533,7 +568,7 @@ func (client *Client) handleEvent(event *Event) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if len(event.Args) < 2 || event.Args[2] != "*" { |
|
|
|
|
|
|
|
|
if len(event.Args) < 3 || event.Args[2] != "*" { |
|
|
client.mutex.RLock() |
|
|
client.mutex.RLock() |
|
|
requestedCount := len(client.capsRequested) |
|
|
requestedCount := len(client.capsRequested) |
|
|
client.mutex.RUnlock() |
|
|
client.mutex.RUnlock() |
|
@ -618,25 +653,25 @@ func (client *Client) handleEvent(event *Event) { |
|
|
user := event.Args[2] |
|
|
user := event.Args[2] |
|
|
host := event.Args[3] |
|
|
host := event.Args[3] |
|
|
|
|
|
|
|
|
client.mutex.Lock() |
|
|
|
|
|
if nick == client.nick { |
|
|
if nick == client.nick { |
|
|
|
|
|
client.mutex.Lock() |
|
|
client.user = user |
|
|
client.user = user |
|
|
client.host = host |
|
|
client.host = host |
|
|
} |
|
|
|
|
|
client.mutex.Unlock() |
|
|
client.mutex.Unlock() |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
case "packet.chghost": |
|
|
case "packet.chghost": |
|
|
{ |
|
|
{ |
|
|
client.mutex.Lock() |
|
|
|
|
|
if event.Nick == client.nick { |
|
|
if event.Nick == client.nick { |
|
|
|
|
|
client.mutex.Lock() |
|
|
client.user = event.Args[1] |
|
|
client.user = event.Args[1] |
|
|
client.host = event.Args[2] |
|
|
client.host = event.Args[2] |
|
|
} |
|
|
|
|
|
client.mutex.Unlock() |
|
|
client.mutex.Unlock() |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
func generateClientID() string { |
|
|
func generateClientID() string { |
|
|
bytes := make([]byte, 12) |
|
|
bytes := make([]byte, 12) |
|
|