mirror of
https://github.com/gissleh/irc.git
synced 2026-10-15 16:42:53 +00:00
Added auto-join
This commit is contained in:
+12
@@ -10,6 +10,7 @@ import (
|
|||||||
type Channel struct {
|
type Channel struct {
|
||||||
name string
|
name string
|
||||||
userlist *list.List
|
userlist *list.List
|
||||||
|
parted bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kind returns "channel"
|
// Kind returns "channel"
|
||||||
@@ -27,6 +28,11 @@ func (channel *Channel) UserList() list.Immutable {
|
|||||||
return channel.userlist.Immutable()
|
return channel.userlist.Immutable()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parted returnes whether the channel has been parted
|
||||||
|
func (channel *Channel) Parted() bool {
|
||||||
|
return channel.parted
|
||||||
|
}
|
||||||
|
|
||||||
// Handle handles messages routed to this channel by the client's event loop
|
// Handle handles messages routed to this channel by the client's event loop
|
||||||
func (channel *Channel) Handle(event *Event, client *Client) {
|
func (channel *Channel) Handle(event *Event, client *Client) {
|
||||||
switch event.Name() {
|
switch event.Name() {
|
||||||
@@ -47,6 +53,12 @@ func (channel *Channel) Handle(event *Event, client *Client) {
|
|||||||
}
|
}
|
||||||
case "packet.part", "packet.quit":
|
case "packet.part", "packet.quit":
|
||||||
{
|
{
|
||||||
|
// Close the target if the client has left
|
||||||
|
if event.Nick == client.Nick() && event.Name() == "packet.part" {
|
||||||
|
channel.parted = true
|
||||||
|
client.RemoveTarget(channel)
|
||||||
|
}
|
||||||
|
|
||||||
channel.userlist.Remove(event.Nick)
|
channel.userlist.Remove(event.Nick)
|
||||||
}
|
}
|
||||||
case "packet.nick":
|
case "packet.nick":
|
||||||
|
|||||||
@@ -503,6 +503,11 @@ func (client *Client) RemoveTarget(target Target) (id string, err error) {
|
|||||||
client.targets = client.targets[:len(client.targets)-1]
|
client.targets = client.targets[:len(client.targets)-1]
|
||||||
delete(client.targteIds, target)
|
delete(client.targteIds, target)
|
||||||
|
|
||||||
|
// Ensure the channel has been parted
|
||||||
|
if channel, ok := target.(*Channel); ok && !channel.parted {
|
||||||
|
client.SendQueuedf("/part %s")
|
||||||
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -621,6 +626,11 @@ func (client *Client) handleEvent(event *Event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For events that were created with targets, handle them now there now.
|
||||||
|
for _, target := range event.targets {
|
||||||
|
target.Handle(event, client)
|
||||||
|
}
|
||||||
|
|
||||||
switch event.name {
|
switch event.name {
|
||||||
|
|
||||||
// Ping Pong
|
// Ping Pong
|
||||||
@@ -1025,6 +1035,27 @@ func (client *Client) handleEvent(event *Event) {
|
|||||||
{
|
{
|
||||||
client.handleInTargets(event.Nick, event)
|
client.handleInTargets(event.Nick, event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Auto-join
|
||||||
|
case "packet.376", "packet.422":
|
||||||
|
{
|
||||||
|
client.mutex.RLock()
|
||||||
|
channels := make([]string, 0, len(client.targets))
|
||||||
|
rejoinEvent := NewEvent("info", "rejoin")
|
||||||
|
for _, target := range client.targets {
|
||||||
|
if channel, ok := target.(*Channel); ok {
|
||||||
|
channels = append(channels, channel.Name())
|
||||||
|
|
||||||
|
rejoinEvent.targets = append(rejoinEvent.targets, target)
|
||||||
|
rejoinEvent.targetIds[target] = client.targteIds[target]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
client.mutex.RUnlock()
|
||||||
|
|
||||||
|
client.Sendf("JOIN %s", strings.Join(channels, ","))
|
||||||
|
|
||||||
|
client.EmitNonBlocking(rejoinEvent)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(event.targets) == 0 {
|
if len(event.targets) == 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user