Skip to content
This repository was archived by the owner on May 3, 2024. It is now read-only.

Commit ac01d3c

Browse files
committed
Version Bump: 0.5.2
Add locks for server and channels Add nick change support and channel notifications Add more IRC handlers Add support for use quit and channel notifications
1 parent 53ba979 commit ac01d3c

File tree

5 files changed

+124
-37
lines changed

5 files changed

+124
-37
lines changed

komanda/client/channel.go

+17-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"math/rand"
66
"sort"
7+
"sync"
78

89
"github.com/fatih/color"
910
"github.com/jroimartin/gocui"
@@ -51,6 +52,8 @@ type Channel struct {
5152
Users []*User
5253
NickListReady bool
5354
Loading *nbc.NonBlockingChan
55+
56+
mu sync.Mutex
5457
}
5558

5659
func (channel *Channel) FindUser(nick string) *User {
@@ -115,18 +118,27 @@ func (channel *Channel) NickMetricsString(view *gocui.View) {
115118
func (channel *Channel) RemoveNick(nick string) {
116119
for i, user := range channel.Users {
117120
if user.Nick == nick {
121+
channel.mu.Lock()
122+
defer channel.mu.Unlock()
123+
118124
channel.Users = append(channel.Users[:i], channel.Users[i+1:]...)
119125
}
120126
}
121127
}
122128

123129
func (channel *Channel) AddNick(nick string) {
124-
user := &User{
125-
Nick: nick,
126-
Color: ANSIColors[rand.Intn(len(ANSIColors))],
127-
}
128130

129-
channel.Users = append(channel.Users, user)
131+
if u := channel.FindUser(nick); u == nil {
132+
channel.mu.Lock()
133+
defer channel.mu.Unlock()
134+
135+
user := &User{
136+
Nick: nick,
137+
Color: ANSIColors[rand.Intn(len(ANSIColors))],
138+
}
139+
140+
channel.Users = append(channel.Users, user)
141+
}
130142
}
131143

132144
func (channel *Channel) Render(private bool) error {

komanda/client/server.go

+11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package client
22

33
import (
44
"errors"
5+
"sync"
56

67
ircClient "github.com/fluffle/goirc/client"
78
"github.com/hectane/go-nonblockingchan"
@@ -31,6 +32,8 @@ type Server struct {
3132
CurrentChannel string
3233

3334
InsecureSkipVerify bool
35+
36+
mu sync.Mutex
3437
}
3538

3639
type Handler func(*gocui.Gui, *gocui.View, *Server) error
@@ -87,16 +90,24 @@ func (server *Server) ChannelView(name string) (*gocui.View, error) {
8790
}
8891

8992
func (server *Server) AddChannel(channel *Channel) {
93+
9094
if _, _, ok := server.HasChannel(channel.Name); !ok {
95+
server.mu.Lock()
96+
defer server.mu.Unlock()
97+
9198
channel.Server = server
9299
server.Channels = append(server.Channels, channel)
93100
}
94101
}
95102

96103
func (server *Server) RemoveChannel(name string) (int, error) {
104+
97105
channel, i, ok := server.HasChannel(name)
98106

99107
if ok {
108+
server.mu.Lock()
109+
defer server.mu.Unlock()
110+
100111
server.Gui.DeleteView(channel.Name)
101112
server.Channels = append(server.Channels[:i], server.Channels[i+1:]...)
102113
return i, nil

komanda/ui/handlers.go

+75-10
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,70 @@ func BindHandlers() {
3737
})
3838
}
3939

40+
Server.Client.HandleFunc("WHOIS", func(conn *irc.Conn, line *irc.Line) {
41+
logger.Logger.Println("WHOIS -----------------------------", spew.Sdump(line))
42+
})
43+
44+
Server.Client.HandleFunc("WHO", func(conn *irc.Conn, line *irc.Line) {
45+
logger.Logger.Println("WHO -----------------------------", spew.Sdump(line))
46+
})
47+
48+
Server.Client.HandleFunc("NOTICE", func(conn *irc.Conn, line *irc.Line) {
49+
logger.Logger.Println("NOTICE -----------------------------", spew.Sdump(line))
50+
})
51+
52+
Server.Client.HandleFunc("NICK", func(conn *irc.Conn, line *irc.Line) {
53+
logger.Logger.Println("NICK -----------------------------", spew.Sdump(line))
54+
55+
for _, c := range Server.Channels {
56+
u := c.FindUser(line.Nick)
57+
58+
if u != nil {
59+
u.Nick = line.Args[0]
60+
61+
Server.Exec(c.Name, func(g *gocui.Gui, v *gocui.View, s *client.Server) error {
62+
fmt.Fprintf(v, "[%s] %s has changed nick to %s\n", color.GreenString("+NICK"), line.Nick, line.Args[0])
63+
return nil
64+
})
65+
}
66+
}
67+
})
68+
69+
Server.Client.HandleFunc("KICK", func(conn *irc.Conn, line *irc.Line) {
70+
logger.Logger.Println("KICK -----------------------------", spew.Sdump(line))
71+
})
72+
73+
Server.Client.HandleFunc("AWAY", func(conn *irc.Conn, line *irc.Line) {
74+
logger.Logger.Println("AWAY -----------------------------", spew.Sdump(line))
75+
})
76+
77+
Server.Client.HandleFunc("ACTION", func(conn *irc.Conn, line *irc.Line) {
78+
logger.Logger.Println("ACTION -----------------------------", spew.Sdump(line))
79+
})
80+
4081
Server.Client.HandleFunc("REGISTER", func(conn *irc.Conn, line *irc.Line) {
41-
// logger.Logger.Println("REGISTER -----------------------------", spew.Sdump(line))
82+
logger.Logger.Println("REGISTER -----------------------------", spew.Sdump(line))
83+
})
84+
85+
Server.Client.HandleFunc("QUIT", func(conn *irc.Conn, line *irc.Line) {
86+
// logger.Logger.Println("QUIT -----------------------------", spew.Sdump(line))
87+
88+
for _, c := range Server.Channels {
89+
u := c.FindUser(line.Nick)
90+
91+
if u != nil {
92+
c.RemoveNick(line.Nick)
93+
94+
Server.Exec(c.Name, func(g *gocui.Gui, v *gocui.View, s *client.Server) error {
95+
fmt.Fprintf(v, "[%s] %s [%s@%s] has quit [%s]\n", color.RedString("-EXIT"), line.Nick, line.Ident, line.Host, line.Text())
96+
return nil
97+
})
98+
}
99+
}
100+
})
101+
102+
Server.Client.HandleFunc("USER", func(conn *irc.Conn, line *irc.Line) {
103+
logger.Logger.Println("USER -----------------------------", spew.Sdump(line))
42104
})
43105

44106
Server.Client.HandleFunc("TOPIC", func(conn *irc.Conn, line *irc.Line) {
@@ -71,7 +133,7 @@ func BindHandlers() {
71133
})
72134

73135
Server.Client.HandleFunc("PART", func(conn *irc.Conn, line *irc.Line) {
74-
logger.Logger.Println("PART -----------------------------", line.Text())
136+
// logger.Logger.Println("PART -----------------------------", line.Text())
75137

76138
if c, _, has := Server.HasChannel(line.Text()); has {
77139
Server.Exec(c.Name, func(g *gocui.Gui, v *gocui.View, s *client.Server) error {
@@ -116,7 +178,7 @@ func BindHandlers() {
116178
// https://www.alien.net.au/irc/irc2numerics.html
117179
//
118180
Server.Client.HandleFunc("332", func(conn *irc.Conn, line *irc.Line) {
119-
logger.Logger.Println("TOPIC........", spew.Sdump(line))
181+
// logger.Logger.Println("TOPIC........", spew.Sdump(line))
120182

121183
Server.Exec(line.Args[1], func(g *gocui.Gui, v *gocui.View, s *client.Server) error {
122184

@@ -137,15 +199,15 @@ func BindHandlers() {
137199
// v.Clear()
138200
// v.SetCursor(0, 0)
139201

140-
logger.Logger.Println("NICK LIST DONE")
202+
// logger.Logger.Println("NICK LIST DONE")
141203

142204
if c, _, has := s.HasChannel(line.Args[1]); has {
143205

144206
go func(c *client.Channel) {
145207
for {
146208
select {
147209
case <-c.Loading.Recv:
148-
logger.Logger.Println("INSIDE THE NAMES AND STUFF...")
210+
// logger.Logger.Println("INSIDE THE NAMES AND STUFF...")
149211
if !c.NickListReady {
150212
c.NickListReady = true
151213

@@ -200,7 +262,7 @@ func BindHandlers() {
200262

201263
// nick list
202264
Server.Client.HandleFunc("353", func(conn *irc.Conn, line *irc.Line) {
203-
logger.Logger.Printf("NICK LIST %s\n", spew.Sdump(line))
265+
// logger.Logger.Printf("NICK LIST %s\n", spew.Sdump(line))
204266

205267
Server.Exec(line.Args[2], func(g *gocui.Gui, v *gocui.View, s *client.Server) error {
206268

@@ -249,9 +311,12 @@ func BindHandlers() {
249311

250312
// logger.Logger.Printf("ADD NICK %s\n", spew.Sdump(nick))
251313

252-
user.Nick = nick
253-
user.Color = client.ANSIColors[rand.Intn(len(client.ANSIColors))]
254-
c.Users = append(c.Users, user)
314+
if u := c.FindUser(nick); u == nil {
315+
user.Nick = nick
316+
user.Color = client.ANSIColors[rand.Intn(len(client.ANSIColors))]
317+
c.Users = append(c.Users, user)
318+
}
319+
255320
}
256321

257322
c.Loading.Send <- nil
@@ -302,7 +367,7 @@ func BindHandlers() {
302367

303368
ircChan := line.Args[0]
304369

305-
logger.Logger.Printf("MSG %s %s %s %s\n", ircChan, line.Nick, line.Host, line.Args)
370+
// logger.Logger.Printf("MSG %s %s %s %s\n", ircChan, line.Nick, line.Host, line.Args)
306371

307372
if ircChan == Server.Client.Me().Nick {
308373

komanda/util.go

+20-21
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,10 @@ import (
55
"strings"
66
"time"
77

8-
"github.com/davecgh/go-spew/spew"
98
"github.com/fatih/color"
109
"github.com/jroimartin/gocui"
1110
"github.com/mephux/komanda-cli/komanda/client"
1211
"github.com/mephux/komanda-cli/komanda/command"
13-
"github.com/mephux/komanda-cli/komanda/logger"
1412
"github.com/mephux/komanda-cli/komanda/share/history"
1513
"github.com/mephux/komanda-cli/komanda/share/trie"
1614
"github.com/mephux/komanda-cli/komanda/ui"
@@ -32,7 +30,7 @@ var (
3230
// TODO: fix \x00 issues
3331
func tabUpdateInput(input *gocui.View) (string, bool) {
3432

35-
logger.Logger.Println(spew.Sdump(input.Buffer()))
33+
// logger.Logger.Println(spew.Sdump(input.Buffer()))
3634

3735
search := strings.TrimSpace(input.ViewBuffer())
3836
searchSplit := strings.Split(search, " ")
@@ -58,8 +56,8 @@ func tabUpdateInput(input *gocui.View) (string, bool) {
5856
fmt.Fprint(input, newInputData+" ")
5957
input.SetCursor(len(input.Buffer())-1, 0)
6058

61-
logger.Logger.Println(spew.Sdump(newInputData + ""))
62-
logger.Logger.Printf("WORD %s -- %s -- %s\n", search, cacheTabSearch, cacheTabResults[cacheTabIndex])
59+
// logger.Logger.Println(spew.Sdump(newInputData + ""))
60+
// logger.Logger.Printf("WORD %s -- %s -- %s\n", search, cacheTabSearch, cacheTabResults[cacheTabIndex])
6361
return "", true
6462
}
6563

@@ -134,7 +132,7 @@ func tabComplete(g *gocui.Gui, v *gocui.View) error {
134132
return nil
135133
}
136134

137-
logger.Logger.Printf("RESULTS %s -- %s\n", search, results)
135+
// logger.Logger.Printf("RESULTS %s -- %s\n", search, results)
138136
}
139137

140138
return nil
@@ -186,15 +184,15 @@ func simpleEditor(v *gocui.View, key gocui.Key, ch rune, mod gocui.Modifier) {
186184
case key == gocui.KeyCtrlE:
187185
v.SetCursor(len(v.Buffer())-1, 0)
188186
case key == gocui.KeyCtrlLsqBracket:
189-
logger.Logger.Println("word...")
187+
// logger.Logger.Println("word...")
190188
}
191189

192190
if !inHistroy {
193191
// InputHistory.Current()
194192
}
195193

196194
if !tab {
197-
logger.Logger.Print("CALL\n")
195+
// logger.Logger.Print("CALL\n")
198196

199197
inCacheTab = false
200198
cacheTabSearch = ""
@@ -211,7 +209,7 @@ func GetLine(g *gocui.Gui, v *gocui.View) error {
211209
line = ""
212210
}
213211

214-
logger.Logger.Printf("LINE %s\n", line)
212+
// logger.Logger.Printf("LINE %s\n", line)
215213

216214
if len(line) <= 0 {
217215
// return errors.New("input line empty")
@@ -227,7 +225,7 @@ func GetLine(g *gocui.Gui, v *gocui.View) error {
227225

228226
Server.Exec(Server.CurrentChannel, func(g *gocui.Gui, v *gocui.View, s *client.Server) error {
229227
if Server.Client.Connected() {
230-
logger.Logger.Println("SEND:::", spew.Sdump(line))
228+
// logger.Logger.Println("SEND:::", spew.Sdump(line))
231229

232230
go Server.Client.Privmsg(Server.CurrentChannel,
233231
strings.Replace(line, "\x00", "", -1))
@@ -254,7 +252,7 @@ func GetLine(g *gocui.Gui, v *gocui.View) error {
254252
} else {
255253
split := strings.Split(strings.Replace(line[1:], "\x00", "", -1), " ")
256254

257-
logger.Logger.Println("IN COMMAND!!!", line, spew.Sdump(split))
255+
// logger.Logger.Println("IN COMMAND!!!", line, spew.Sdump(split))
258256

259257
// mainView, _ := g.View(client.StatusChannel)
260258
// fmt.Fprintln(mainView, "$ COMMAND = ", split[0], len(split))
@@ -359,7 +357,7 @@ func nextView(g *gocui.Gui, v *gocui.View) error {
359357
next = 0
360358
}
361359

362-
logger.Logger.Printf("NEXT INDEX %d\n", next)
360+
// logger.Logger.Printf("NEXT INDEX %d\n", next)
363361

364362
if newView, err := g.View(Server.Channels[next].Name); err != nil {
365363
return err
@@ -373,7 +371,7 @@ func nextView(g *gocui.Gui, v *gocui.View) error {
373371
return err
374372
}
375373

376-
logger.Logger.Printf("Set Current View %d\n", Server.Channels[next].Name)
374+
// logger.Logger.Printf("Set Current View %d\n", Server.Channels[next].Name)
377375
Server.CurrentChannel = Server.Channels[next].Name
378376
Server.Channels[next].Unread = false
379377

@@ -395,7 +393,7 @@ func getCurrentChannelIndex() int {
395393
}
396394

397395
func prevView(g *gocui.Gui, v *gocui.View) error {
398-
logger.Logger.Println("word")
396+
// logger.Logger.Println("word")
399397

400398
curView = getCurrentChannelIndex()
401399

@@ -405,7 +403,7 @@ func prevView(g *gocui.Gui, v *gocui.View) error {
405403
next = len(Server.Channels) - 1
406404
}
407405

408-
logger.Logger.Printf("PREV INDEX %d\n", next)
406+
// logger.Logger.Printf("PREV INDEX %d\n", next)
409407

410408
if newView, err := g.View(Server.Channels[next].Name); err != nil {
411409
return err
@@ -419,7 +417,7 @@ func prevView(g *gocui.Gui, v *gocui.View) error {
419417
return err
420418
}
421419

422-
logger.Logger.Printf("Set Current View %d\n", Server.Channels[next].Name)
420+
// logger.Logger.Printf("Set Current View %d\n", Server.Channels[next].Name)
423421
Server.CurrentChannel = Server.Channels[next].Name
424422
Server.Channels[next].Unread = false
425423

@@ -433,12 +431,13 @@ func prevView(g *gocui.Gui, v *gocui.View) error {
433431
func moveView(g *gocui.Gui, v *gocui.View, dx, dy int) error {
434432

435433
name := v.Name()
436-
x0, y0, x1, y1, err := g.ViewPosition(name)
437-
if err != nil {
438-
return err
439-
}
440434

441-
logger.Logger.Printf("RESIZE %d %d %d %d\n", x0+dx, y0+dy, x1+dx, y1+dy)
435+
// x0, y0, x1, y1, err := g.ViewPosition(name)
436+
// if err != nil {
437+
// return err
438+
// }
439+
440+
// logger.Logger.Printf("RESIZE %d %d %d %d\n", x0+dx, y0+dy, x1+dx, y1+dy)
442441

443442
if _, err := g.SetView(name, 0, 0, 0, 0); err != nil {
444443
return err

komanda/version.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const Name = "komanda"
1818
const Description = "IRC Client"
1919

2020
// Version number
21-
const Version = "0.5.1"
21+
const Version = "0.5.2"
2222

2323
// Website number
2424
const Website = "github.com/mephux/komanda"

0 commit comments

Comments
 (0)