@@ -16,10 +16,53 @@ const reHighlight = `\b(%s)\b`
1616
1717var ErrUserClosed = errors .New ("user closed" )
1818
19- // User definition, implemented set Item interface and io.Writer
20- type User struct {
19+ // User container that knows about writing to an IO screen.
20+ type UserScreen struct {
21+ * User
2122 io.WriteCloser
23+ }
24+
25+ func (u * UserScreen ) Close () error {
26+ u .User .Close ()
27+ return u .WriteCloser .Close ()
28+ }
29+
30+ // HandleMsg will render the message to the screen, blocking.
31+ func (u * UserScreen ) HandleMsg (m Message ) error {
32+ r := u .render (m )
33+ _ , err := u .Write ([]byte (r ))
34+ if err != nil {
35+ logger .Printf ("Write failed to %s, closing: %s" , u .Name (), err )
36+ u .User .Close ()
37+ u .WriteCloser .Close ()
38+ }
39+ return err
40+ }
2241
42+ // Consume message buffer into the handler. Will block, should be called in a
43+ // goroutine.
44+ func (u * UserScreen ) Consume () {
45+ for {
46+ select {
47+ case <- u .done :
48+ return
49+ case m , ok := <- u .msg :
50+ if ! ok {
51+ return
52+ }
53+ u .HandleMsg (m )
54+ }
55+ }
56+ }
57+
58+ // Consume one message and stop, mostly for testing
59+ // TODO: Stop using it and remove it.
60+ func (u * UserScreen ) ConsumeOne () Message {
61+ return <- u .msg
62+ }
63+
64+ // User definition, implemented set Item interface and io.Writer
65+ type User struct {
2366 colorIdx int
2467 joined time.Time
2568 closeOnce sync.Once
@@ -29,7 +72,7 @@ type User struct {
2972 mu sync.Mutex
3073 name string
3174 config UserConfig
32- replyTo * User // Set when user gets a /msg, for replying.
75+ replyTo Author // Set when user gets a /msg, for replying.
3376}
3477
3578func NewUser (name string ) * User {
@@ -45,11 +88,11 @@ func NewUser(name string) *User {
4588 return & u
4689}
4790
48- func NewUserScreen (name string , screen io.WriteCloser ) * User {
49- u := NewUser ( name )
50- u . WriteCloser = screen
51-
52- return u
91+ func NewUserScreen (name string , screen io.WriteCloser ) * UserScreen {
92+ return & UserScreen {
93+ User : NewUser ( name ),
94+ WriteCloser : screen ,
95+ }
5396}
5497
5598func (u * User ) Config () UserConfig {
@@ -70,6 +113,10 @@ func (u *User) ID() string {
70113 return SanitizeName (u .name )
71114}
72115
116+ func (u * User ) Color () int {
117+ return u .colorIdx
118+ }
119+
73120func (u * User ) Name () string {
74121 u .mu .Lock ()
75122 defer u .mu .Unlock ()
@@ -89,14 +136,14 @@ func (u *User) SetName(name string) {
89136}
90137
91138// ReplyTo returns the last user that messaged this user.
92- func (u * User ) ReplyTo () * User {
139+ func (u * User ) ReplyTo () Author {
93140 u .mu .Lock ()
94141 defer u .mu .Unlock ()
95142 return u .replyTo
96143}
97144
98145// SetReplyTo sets the last user to message this user.
99- func (u * User ) SetReplyTo (user * User ) {
146+ func (u * User ) SetReplyTo (user Author ) {
100147 // TODO: Use UserConfig.ReplyTo string
101148 u .mu .Lock ()
102149 defer u .mu .Unlock ()
@@ -112,46 +159,11 @@ func (u *User) setColorIdx(idx int) {
112159// Disconnect user, stop accepting messages
113160func (u * User ) Close () {
114161 u .closeOnce .Do (func () {
115- u .WriteCloser .Close ()
116162 // close(u.msg) TODO: Close?
117163 close (u .done )
118164 })
119165}
120166
121- // Consume message buffer into the handler. Will block, should be called in a
122- // goroutine.
123- func (u * User ) Consume () {
124- for {
125- select {
126- case <- u .done :
127- return
128- case m , ok := <- u .msg :
129- if ! ok {
130- return
131- }
132- u .HandleMsg (m )
133- }
134- }
135- }
136-
137- // Consume one message and stop, mostly for testing
138- // TODO: Stop using it and remove it.
139- func (u * User ) ConsumeOne () Message {
140- return <- u .msg
141- }
142-
143- // Check if there are pending messages, used for testing
144- // TODO: Stop using it and remove it.
145- func (u * User ) HasMessages () bool {
146- select {
147- case msg := <- u .msg :
148- u .msg <- msg
149- return true
150- default :
151- return false
152- }
153- }
154-
155167// SetHighlight sets the highlighting regular expression to match string.
156168func (u * User ) SetHighlight (s string ) error {
157169 re , err := regexp .Compile (fmt .Sprintf (reHighlight , s ))
@@ -177,17 +189,6 @@ func (u *User) render(m Message) string {
177189 }
178190}
179191
180- // HandleMsg will render the message to the screen, blocking.
181- func (u * User ) HandleMsg (m Message ) error {
182- r := u .render (m )
183- _ , err := u .Write ([]byte (r ))
184- if err != nil {
185- logger .Printf ("Write failed to %s, closing: %s" , u .Name (), err )
186- u .Close ()
187- }
188- return err
189- }
190-
191192// Add message to consume by user
192193func (u * User ) Send (m Message ) error {
193194 select {
0 commit comments