Browse Source

channels: Automagically save channel bans/excepts/invites

tags/v0.7.0
Daniel Oaks 7 years ago
parent
commit
861b65eb39
4 changed files with 109 additions and 8 deletions
  1. 1
    0
      CHANGELOG.md
  2. 27
    7
      irc/channel.go
  3. 32
    0
      irc/channelreg.go
  4. 49
    1
      irc/modes.go

+ 1
- 0
CHANGELOG.md View File

@@ -30,6 +30,7 @@ New release of Oragono!
30 30
 ### Fixed
31 31
 * Fixed an account issue where clients could login to multiple accounts at once.
32 32
 * Fixed issues that prevented rehashing after the first rehash had gone through successfully.
33
+* Fixed the inability to view channel ban, ban exception, and invite exception lists.
33 34
 
34 35
 
35 36
 ## [0.6.0] - 2017-01-19

+ 27
- 7
irc/channel.go View File

@@ -299,6 +299,15 @@ func (channel *Channel) Join(client *Client, key string) {
299 299
 				channel.topicSetTime = chanReg.TopicSetTime
300 300
 				channel.name = chanReg.Name
301 301
 				channel.createdTime = chanReg.RegisteredAt
302
+				for _, mask := range chanReg.Banlist {
303
+					channel.lists[BanMask].Add(mask)
304
+				}
305
+				for _, mask := range chanReg.Exceptlist {
306
+					channel.lists[ExceptMask].Add(mask)
307
+				}
308
+				for _, mask := range chanReg.Invitelist {
309
+					channel.lists[InviteMask].Add(mask)
310
+				}
302 311
 			}
303 312
 			return nil
304 313
 		})
@@ -587,13 +596,24 @@ func (channel *Channel) applyModeMemberNoMutex(client *Client, mode Mode,
587 596
 }
588 597
 
589 598
 func (channel *Channel) ShowMaskList(client *Client, mode Mode) {
590
-	//TODO(dan): WE NEED TO fiX this PROPERLY
591
-	log.Fatal("Implement ShowMaskList")
592
-	/*
593
-		for lmask := range channel.lists[mode].masks {
594
-			client.RplMaskList(mode, channel, lmask)
595
-		}
596
-		client.RplEndOfMaskList(mode, channel)*/
599
+	// choose appropriate modes
600
+	var rpllist, rplendoflist string
601
+	if mode == BanMask {
602
+		rpllist = RPL_BANLIST
603
+		rplendoflist = RPL_ENDOFBANLIST
604
+	} else if mode == ExceptMask {
605
+		rpllist = RPL_EXCEPTLIST
606
+		rplendoflist = RPL_ENDOFEXCEPTLIST
607
+	} else if mode == InviteMask {
608
+		rpllist = RPL_INVITELIST
609
+		rplendoflist = RPL_ENDOFINVITELIST
610
+	}
611
+
612
+	// send out responses
613
+	for mask := range channel.lists[mode].masks {
614
+		client.Send(nil, client.server.name, rpllist, client.nick, channel.name, mask)
615
+	}
616
+	client.Send(nil, client.server.name, rplendoflist, client.nick, channel.name, "End of list")
597 617
 }
598 618
 
599 619
 func (channel *Channel) applyModeMask(client *Client, mode Mode, op ModeOp, mask string) bool {

+ 32
- 0
irc/channelreg.go View File

@@ -9,6 +9,8 @@ import (
9 9
 	"strconv"
10 10
 	"time"
11 11
 
12
+	"encoding/json"
13
+
12 14
 	"github.com/tidwall/buntdb"
13 15
 )
14 16
 
@@ -20,6 +22,9 @@ const (
20 22
 	keyChannelTopic        = "channel.topic %s"
21 23
 	keyChannelTopicSetBy   = "channel.topic.setby %s"
22 24
 	keyChannelTopicSetTime = "channel.topic.settime %s"
25
+	keyChannelBanlist      = "channel.banlist %s"
26
+	keyChannelExceptlist   = "channel.exceptlist %s"
27
+	keyChannelInvitelist   = "channel.invitelist %s"
23 28
 )
24 29
 
25 30
 var (
@@ -40,6 +45,12 @@ type RegisteredChannel struct {
40 45
 	TopicSetBy string
41 46
 	// TopicSetTime represents the time the topic was set.
42 47
 	TopicSetTime time.Time
48
+	// Banlist represents the bans set on the channel.
49
+	Banlist []string
50
+	// Exceptlist represents the exceptions set on the channel.
51
+	Exceptlist []string
52
+	// Invitelist represents the invite exceptions set on the channel.
53
+	Invitelist []string
43 54
 }
44 55
 
45 56
 // loadChannelNoMutex loads a channel from the store.
@@ -63,6 +74,16 @@ func (server *Server) loadChannelNoMutex(tx *buntdb.Tx, channelKey string) *Regi
63 74
 	topicSetBy, _ := tx.Get(fmt.Sprintf(keyChannelTopicSetBy, channelKey))
64 75
 	topicSetTime, _ := tx.Get(fmt.Sprintf(keyChannelTopicSetTime, channelKey))
65 76
 	topicSetTimeInt, _ := strconv.ParseInt(topicSetTime, 10, 64)
77
+	banlistString, _ := tx.Get(fmt.Sprintf(keyChannelBanlist, channelKey))
78
+	exceptlistString, _ := tx.Get(fmt.Sprintf(keyChannelExceptlist, channelKey))
79
+	invitelistString, _ := tx.Get(fmt.Sprintf(keyChannelInvitelist, channelKey))
80
+
81
+	var banlist []string
82
+	_ = json.Unmarshal([]byte(banlistString), &banlist)
83
+	var exceptlist []string
84
+	_ = json.Unmarshal([]byte(exceptlistString), &exceptlist)
85
+	var invitelist []string
86
+	_ = json.Unmarshal([]byte(invitelistString), &invitelist)
66 87
 
67 88
 	chanInfo := RegisteredChannel{
68 89
 		Name:         name,
@@ -71,6 +92,9 @@ func (server *Server) loadChannelNoMutex(tx *buntdb.Tx, channelKey string) *Regi
71 92
 		Topic:        topic,
72 93
 		TopicSetBy:   topicSetBy,
73 94
 		TopicSetTime: time.Unix(topicSetTimeInt, 0),
95
+		Banlist:      banlist,
96
+		Exceptlist:   exceptlist,
97
+		Invitelist:   invitelist,
74 98
 	}
75 99
 	server.registeredChannels[channelKey] = &chanInfo
76 100
 
@@ -86,5 +110,13 @@ func (server *Server) saveChannelNoMutex(tx *buntdb.Tx, channelKey string, chann
86 110
 	tx.Set(fmt.Sprintf(keyChannelTopic, channelKey), channelInfo.Topic, nil)
87 111
 	tx.Set(fmt.Sprintf(keyChannelTopicSetBy, channelKey), channelInfo.TopicSetBy, nil)
88 112
 	tx.Set(fmt.Sprintf(keyChannelTopicSetTime, channelKey), strconv.FormatInt(channelInfo.TopicSetTime.Unix(), 10), nil)
113
+
114
+	banlistString, _ := json.Marshal(channelInfo.Banlist)
115
+	tx.Set(fmt.Sprintf(keyChannelBanlist, channelKey), string(banlistString), nil)
116
+	exceptlistString, _ := json.Marshal(channelInfo.Exceptlist)
117
+	tx.Set(fmt.Sprintf(keyChannelExceptlist, channelKey), string(exceptlistString), nil)
118
+	invitelistString, _ := json.Marshal(channelInfo.Invitelist)
119
+	tx.Set(fmt.Sprintf(keyChannelInvitelist, channelKey), string(invitelistString), nil)
120
+
89 121
 	server.registeredChannels[channelKey] = &channelInfo
90 122
 }

+ 49
- 1
irc/modes.go View File

@@ -10,6 +10,7 @@ import (
10 10
 	"strings"
11 11
 
12 12
 	"github.com/DanielOaks/girc-go/ircmsg"
13
+	"github.com/tidwall/buntdb"
13 14
 )
14 15
 
15 16
 // ModeOp is an operation performed with modes
@@ -311,7 +312,7 @@ func ParseChannelModeChanges(params ...string) (ModeChanges, map[rune]bool) {
311 312
 	changes := make(ModeChanges, 0)
312 313
 	unknown := make(map[rune]bool)
313 314
 
314
-	if len(params) > 1 {
315
+	if 0 < len(params) {
315 316
 		modeArg := params[0]
316 317
 		op := ModeOp(modeArg[0])
317 318
 		if (op == Add) || (op == Remove) {
@@ -553,6 +554,53 @@ func cmodeHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
553 554
 		applied = ApplyChannelModeChanges(channel, client, msg.Command == "SAMODE", changes)
554 555
 	}
555 556
 
557
+	// save changes to banlist/exceptlist/invexlist
558
+	var banlistUpdated, exceptlistUpdated, invexlistUpdated bool
559
+	for _, change := range applied {
560
+		if change.mode == BanMask {
561
+			banlistUpdated = true
562
+		} else if change.mode == ExceptMask {
563
+			exceptlistUpdated = true
564
+		} else if change.mode == InviteMask {
565
+			invexlistUpdated = true
566
+		}
567
+	}
568
+
569
+	server.registeredChannelsMutex.Lock()
570
+	if 0 < len(applied) && server.registeredChannels[channel.nameCasefolded] != nil && (banlistUpdated || exceptlistUpdated || invexlistUpdated) {
571
+		server.store.Update(func(tx *buntdb.Tx) error {
572
+			chanInfo := server.loadChannelNoMutex(tx, channel.nameCasefolded)
573
+
574
+			if banlistUpdated {
575
+				var banlist []string
576
+				for mask := range channel.lists[BanMask].masks {
577
+					banlist = append(banlist, mask)
578
+				}
579
+				chanInfo.Banlist = banlist
580
+			}
581
+			if exceptlistUpdated {
582
+				var exceptlist []string
583
+				for mask := range channel.lists[ExceptMask].masks {
584
+					exceptlist = append(exceptlist, mask)
585
+				}
586
+				chanInfo.Exceptlist = exceptlist
587
+			}
588
+			if invexlistUpdated {
589
+				var invitelist []string
590
+				for mask := range channel.lists[InviteMask].masks {
591
+					invitelist = append(invitelist, mask)
592
+				}
593
+				chanInfo.Invitelist = invitelist
594
+			}
595
+
596
+			server.saveChannelNoMutex(tx, channel.nameCasefolded, *chanInfo)
597
+
598
+			return nil
599
+		})
600
+	}
601
+	server.registeredChannelsMutex.Unlock()
602
+
603
+	// send out changes
556 604
 	if len(applied) > 0 {
557 605
 		//TODO(dan): we should change the name of String and make it return a slice here
558 606
 		args := append([]string{channel.name}, strings.Split(applied.String(), " ")...)

Loading…
Cancel
Save