summaryrefslogtreecommitdiff
path: root/irc/states.go
diff options
context:
space:
mode:
Diffstat (limited to 'irc/states.go')
-rw-r--r--irc/states.go34
1 files changed, 29 insertions, 5 deletions
diff --git a/irc/states.go b/irc/states.go
index 3ba5572..e560bdf 100644
--- a/irc/states.go
+++ b/irc/states.go
@@ -139,6 +139,7 @@ type Session struct {
running atomic.Value // bool
registered bool
+ typings *Typings
typingStamps map[string]time.Time
nick string
@@ -165,6 +166,7 @@ func NewSession(conn io.ReadWriteCloser, params SessionParams) (*Session, error)
acts: make(chan action, 64),
evts: make(chan Event, 64),
debug: params.Debug,
+ typings: NewTypings(),
typingStamps: map[string]time.Time{},
nick: params.Nickname,
nickCf: CasemapASCII(params.Nickname),
@@ -267,6 +269,17 @@ func (s *Session) Names(channel string) []Member {
return names
}
+func (s *Session) Typings(target string) []string {
+ targetCf := s.Casemap(target)
+ var res []string
+ for t := range s.typings.targets {
+ if targetCf == t.Target {
+ res = append(res, s.users[t.Name].Name.Name)
+ }
+ }
+ return res
+}
+
func (s *Session) ChannelsSharedWith(name string) []string {
var user *User
if u, ok := s.users[s.Casemap(name)]; ok {
@@ -420,6 +433,13 @@ func (s *Session) run() {
} else {
err = s.handleStart(msg)
}
+ case t := <-s.typings.Stops():
+ s.evts <- TagEvent{
+ User: s.users[t.Name].Name,
+ Target: s.channels[t.Target].Name,
+ Typing: TypingDone,
+ Time: time.Now(),
+ }
}
if err != nil {
@@ -686,12 +706,12 @@ func (s *Session) handle(msg Message) (err error) {
if u, ok := s.users[nickCf]; ok {
delete(c.Members, u)
s.cleanUser(u)
- t := msg.TimeOrNow()
+ s.typings.Done(channelCf, nickCf)
s.evts <- UserPartEvent{
User: msg.Prefix.Copy(),
Channel: c.Name,
- Time: t,
+ Time: msg.TimeOrNow(),
}
}
}
@@ -699,20 +719,20 @@ func (s *Session) handle(msg Message) (err error) {
nickCf := s.Casemap(msg.Prefix.Name)
if u, ok := s.users[nickCf]; ok {
- t := msg.TimeOrNow()
var channels []string
- for _, c := range s.channels {
+ for channelCf, c := range s.channels {
if _, ok := c.Members[u]; ok {
channels = append(channels, c.Name)
delete(c.Members, u)
s.cleanUser(u)
+ s.typings.Done(channelCf, nickCf)
}
}
s.evts <- UserQuitEvent{
User: msg.Prefix.Copy(),
Channels: channels,
- Time: t,
+ Time: msg.TimeOrNow(),
}
}
case rplNamreply:
@@ -776,10 +796,13 @@ func (s *Session) handle(msg Message) (err error) {
if t, ok := msg.Tags["+typing"]; ok {
if t == "active" {
typing = TypingActive
+ s.typings.Active(targetCf, nickCf)
} else if t == "paused" {
typing = TypingPaused
+ s.typings.Active(targetCf, nickCf)
} else if t == "done" {
typing = TypingDone
+ s.typings.Done(targetCf, nickCf)
}
} else {
break
@@ -859,6 +882,7 @@ func (s *Session) handle(msg Message) (err error) {
func (s *Session) privmsgToEvent(msg Message) (ev MessageEvent) {
targetCf := s.Casemap(msg.Params[0])
+ s.typings.Done(targetCf, s.Casemap(msg.Prefix.Name))
ev = MessageEvent{
User: msg.Prefix.Copy(), // TODO correctly casemap
Target: msg.Params[0], // TODO correctly casemap