commit 916a9c8

delthas  ·  2021-11-16 17:19:19 +0000 UTC
parent 56fce9e
Add support for user buffers
3 files changed,  +44, -22
M app.go
M app.go
+7, -6
 1@@ -748,6 +748,9 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) {
 2 		})
 3 	case irc.MessageEvent:
 4 		buffer, line, notification := app.formatMessage(s, ev)
 5+		if buffer != "" && !s.IsChannel(buffer) {
 6+			app.win.AddBuffer(netID, "", buffer)
 7+		}
 8 		app.win.AddLine(netID, buffer, notification, line)
 9 		if notification == ui.NotifyHighlight {
10 			app.notifyHighlight(buffer, ev.User, line.Body.String())
11@@ -936,6 +939,7 @@ func (app *App) completions(cursorIdx int, text []rune) []ui.Completion {
12 // - what kind of notification senpai should send.
13 func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer string, line ui.Line, notification ui.NotifyType) {
14 	isFromSelf := s.IsMe(ev.User)
15+	isToSelf := s.IsMe(ev.Target)
16 	isHighlight := app.isHighlight(s, ev.Content)
17 	isAction := strings.HasPrefix(ev.Content, "\x01ACTION")
18 	isQuery := !ev.TargetIsChannel && ev.Command == "PRIVMSG"
19@@ -948,8 +952,8 @@ func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer strin
20 		} else {
21 			isHighlight = true
22 		}
23-	} else if !ev.TargetIsChannel {
24-		buffer = ""
25+	} else if isToSelf {
26+		buffer = ev.User
27 	} else {
28 		buffer = ev.Target
29 	}
30@@ -965,10 +969,7 @@ func (app *App) formatMessage(s *irc.Session, ev irc.MessageEvent) (buffer strin
31 
32 	head := ev.User
33 	headColor := tcell.ColorWhite
34-	if isFromSelf && isQuery {
35-		head = "\u2192 " + ev.Target
36-		headColor = identColor(ev.Target)
37-	} else if isAction || isNotice {
38+	if isAction || isNotice {
39 		head = "*"
40 	} else {
41 		headColor = identColor(head)
+14, -5
 1@@ -152,7 +152,7 @@ func noCommand(app *App, content string) error {
 2 		buffer, line, _ := app.formatMessage(s, irc.MessageEvent{
 3 			User:            s.Nick(),
 4 			Target:          buffer,
 5-			TargetIsChannel: true,
 6+			TargetIsChannel: s.IsChannel(buffer),
 7 			Command:         "PRIVMSG",
 8 			Content:         content,
 9 			Time:            time.Now(),
10@@ -280,7 +280,7 @@ func commandDoMe(app *App, args []string) (err error) {
11 		buffer, line, _ := app.formatMessage(s, irc.MessageEvent{
12 			User:            s.Nick(),
13 			Target:          buffer,
14-			TargetIsChannel: true,
15+			TargetIsChannel: s.IsChannel(buffer),
16 			Command:         "PRIVMSG",
17 			Content:         content,
18 			Time:            time.Now(),
19@@ -303,11 +303,15 @@ func commandDoMsg(app *App, args []string) (err error) {
20 		buffer, line, _ := app.formatMessage(s, irc.MessageEvent{
21 			User:            s.Nick(),
22 			Target:          target,
23-			TargetIsChannel: true,
24+			TargetIsChannel: s.IsChannel(target),
25 			Command:         "PRIVMSG",
26 			Content:         content,
27 			Time:            time.Now(),
28 		})
29+		if buffer != "" && !s.IsChannel(target) {
30+			app.win.AddBuffer(netID, "", buffer)
31+		}
32+
33 		app.win.AddLine(netID, buffer, ui.NotifyNone, line)
34 	}
35 	return nil
36@@ -397,7 +401,12 @@ func commandDoPart(app *App, args []string) (err error) {
37 	if channel == "" {
38 		return fmt.Errorf("cannot part this buffer")
39 	}
40-	s.Part(channel, reason)
41+
42+	if s.IsChannel(channel) {
43+		s.Part(channel, reason)
44+	} else {
45+		app.win.RemoveBuffer(netID, channel)
46+	}
47 	return nil
48 }
49 
50@@ -432,7 +441,7 @@ func commandDoR(app *App, args []string) (err error) {
51 		buffer, line, _ := app.formatMessage(s, irc.MessageEvent{
52 			User:            s.Nick(),
53 			Target:          app.lastQuery,
54-			TargetIsChannel: true,
55+			TargetIsChannel: s.IsChannel(app.lastQuery),
56 			Command:         "PRIVMSG",
57 			Content:         args[0],
58 			Time:            time.Now(),
+23, -11
 1@@ -218,20 +218,32 @@ func (s *Session) Users() []string {
 2 	return users
 3 }
 4 
 5-// Names returns the list of users in the given channel, or nil if this channel
 6-// is not known by the session.
 7+// Names returns the list of users in the given target, or nil if the target
 8+// is not a known channel or nick in the session.
 9 // The list is sorted according to member name.
10-func (s *Session) Names(channel string) []Member {
11+func (s *Session) Names(target string) []Member {
12 	var names []Member
13-	if c, ok := s.channels[s.Casemap(channel)]; ok {
14-		names = make([]Member, 0, len(c.Members))
15-		for u, pl := range c.Members {
16-			names = append(names, Member{
17-				PowerLevel: pl,
18-				Name:       u.Name.Copy(),
19-				Away:       u.Away,
20-			})
21+	if s.IsChannel(target) {
22+		if c, ok := s.channels[s.Casemap(target)]; ok {
23+			names = make([]Member, 0, len(c.Members))
24+			for u, pl := range c.Members {
25+				names = append(names, Member{
26+					PowerLevel:   pl,
27+					Name:         u.Name.Copy(),
28+					Away:         u.Away,
29+				})
30+			}
31 		}
32+	} else if u, ok := s.users[s.Casemap(target)]; ok {
33+		names = append(names, Member{
34+			Name:         u.Name.Copy(),
35+			Away:         u.Away,
36+		})
37+		names = append(names, Member{
38+			Name: &Prefix{
39+				Name: s.nick,
40+			},
41+		})
42 	}
43 	sort.Sort(members(names))
44 	return names