mirror of
https://github.com/shazow/ssh-chat.git
synced 2025-07-22 13:34:29 +02:00
chat/message/user: screen -> WriteCloser embedded
This commit is contained in:
parent
5f2a230ecc
commit
01b989cab2
@ -18,13 +18,13 @@ var ErrUserClosed = errors.New("user closed")
|
|||||||
|
|
||||||
// User definition, implemented set Item interface and io.Writer
|
// User definition, implemented set Item interface and io.Writer
|
||||||
type User struct {
|
type User struct {
|
||||||
colorIdx int
|
io.WriteCloser
|
||||||
joined time.Time
|
|
||||||
msg chan Message
|
|
||||||
done chan struct{}
|
|
||||||
|
|
||||||
screen io.WriteCloser
|
colorIdx int
|
||||||
|
joined time.Time
|
||||||
closeOnce sync.Once
|
closeOnce sync.Once
|
||||||
|
msg chan Message
|
||||||
|
done chan struct{}
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
name string
|
name string
|
||||||
@ -47,7 +47,7 @@ func NewUser(name string) *User {
|
|||||||
|
|
||||||
func NewUserScreen(name string, screen io.WriteCloser) *User {
|
func NewUserScreen(name string, screen io.WriteCloser) *User {
|
||||||
u := NewUser(name)
|
u := NewUser(name)
|
||||||
u.screen = screen
|
u.WriteCloser = screen
|
||||||
|
|
||||||
return u
|
return u
|
||||||
}
|
}
|
||||||
@ -112,9 +112,7 @@ func (u *User) setColorIdx(idx int) {
|
|||||||
// Disconnect user, stop accepting messages
|
// Disconnect user, stop accepting messages
|
||||||
func (u *User) Close() {
|
func (u *User) Close() {
|
||||||
u.closeOnce.Do(func() {
|
u.closeOnce.Do(func() {
|
||||||
if u.screen != nil {
|
u.WriteCloser.Close()
|
||||||
u.screen.Close()
|
|
||||||
}
|
|
||||||
// close(u.msg) TODO: Close?
|
// close(u.msg) TODO: Close?
|
||||||
close(u.done)
|
close(u.done)
|
||||||
})
|
})
|
||||||
@ -182,7 +180,7 @@ func (u *User) render(m Message) string {
|
|||||||
// HandleMsg will render the message to the screen, blocking.
|
// HandleMsg will render the message to the screen, blocking.
|
||||||
func (u *User) HandleMsg(m Message) error {
|
func (u *User) HandleMsg(m Message) error {
|
||||||
r := u.render(m)
|
r := u.render(m)
|
||||||
_, err := u.screen.Write([]byte(r))
|
_, err := u.Write([]byte(r))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Printf("Write failed to %s, closing: %s", u.Name(), err)
|
logger.Printf("Write failed to %s, closing: %s", u.Name(), err)
|
||||||
u.Close()
|
u.Close()
|
||||||
|
@ -13,12 +13,15 @@ func TestMakeUser(t *testing.T) {
|
|||||||
m := NewAnnounceMsg("hello")
|
m := NewAnnounceMsg("hello")
|
||||||
|
|
||||||
defer u.Close()
|
defer u.Close()
|
||||||
u.Send(m)
|
err := u.Send(m)
|
||||||
u.HandleMsg(u.ConsumeOne())
|
if err != nil {
|
||||||
|
t.Fatalf("failed to send: %s", err)
|
||||||
|
}
|
||||||
|
u.HandleMsg(<-u.msg)
|
||||||
|
|
||||||
s.Read(&actual)
|
s.Read(&actual)
|
||||||
expected = []byte(m.String() + Newline)
|
expected = []byte(m.String() + Newline)
|
||||||
if !reflect.DeepEqual(actual, expected) {
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
t.Errorf("Got: `%s`; Expected: `%s`", actual, expected)
|
t.Errorf("Got: %q; Expected: %q", actual, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,9 @@ func TestSet(t *testing.T) {
|
|||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = s.Add(set.Itemize(u2.ID(), u2))
|
err = s.AddNew(set.Itemize(u2.ID(), u2))
|
||||||
if err != set.ErrCollision {
|
if err != set.ErrCollision {
|
||||||
t.Error(err)
|
t.Errorf("expected ErrCollision, got: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
size := s.Len()
|
size := s.Len()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user