12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- package main
- import (
- "github.com/golang-cjr/xep/hookexecutor"
- "github.com/golang-cjr/xep/muc"
- "github.com/kpmy/xippo/c2s/actors"
- "github.com/kpmy/xippo/c2s/actors/steps"
- "github.com/kpmy/xippo/c2s/stream"
- "github.com/kpmy/xippo/entity"
- "github.com/kpmy/xippo/entity/dyn"
- "github.com/kpmy/xippo/units"
- "log"
- "reflect"
- "strings"
- )
- var hookExec *hookexecutor.Executor
- func bot(st stream.Stream) error {
- actors.With().Do(actors.C(steps.PresenceTo(units.Bare2Full(ROOM, ME), entity.CHAT, "http://d.ocsf.in/stat | https://github.com/golang-cjr/xep"))).Run(st)
- hookExec = hookexecutor.NewExecutor(st)
- hookExec.Start()
- for {
- st.Ring(conv(func(_e entity.Entity) {
- switch e := _e.(type) {
- case *entity.Message:
- if strings.HasPrefix(e.From, ROOM+"/") && e.Body != "" {
- sender := strings.TrimPrefix(e.From, ROOM+"/")
- um := muc.UserMapping()
- user := sender
- if u, ok := um[sender]; ok {
- user, _ = u.(string)
- }
- if e.Type == entity.GROUPCHAT {
- room.Lock()
- if sender != ME {
- IncStat(user)
- IncStatLen(user, e.Body)
- room.Active(user)
- }
- room.Grow(Post{Nick: sender, User: user, Msg: e.Body})
- room.Unlock()
- }
- if sender != ME {
- words.Lock()
- Stem(e.Body)
- words.Unlock()
- }
- if sender != ME {
- hookExec.NewEvent(hookexecutor.IncomingEvent{"message", map[string]string{"sender": sender, "body": e.Body}})
- switch {
- case strings.EqualFold(strings.TrimSpace(e.Body), "пщ"):
- go func() {
- actors.With().Do(actors.C(doReply(sender, e.Type, "пщ!"))).Run(st)
- }()
- case strings.HasPrefix(e.Body, "xep"):
- body := strings.TrimPrefix(e.Body, "xep")
- body = strings.TrimSpace(body)
- if body != "" {
- go func() {
- actors.With().Do(actors.C(doReply(sender, entity.GROUPCHAT, body))).Run(st)
- }()
- }
- }
- }
- }
- case dyn.Entity:
- switch e.Type() {
- case dyn.PRESENCE:
- if from := e.Model().Attr("from"); from != "" && strings.HasPrefix(from, ROOM+"/") {
- sender := strings.TrimPrefix(from, ROOM+"/")
- um := muc.UserMapping()
- user := sender
- if u, ok := um[sender]; ok {
- user, _ = u.(string)
- }
- actors.With().Do(R(func(r *Room) (e error) {
- r.User(user)
- return
- })).Run(room)
- if show := firstByName(e.Model(), "show"); e.Model().Attr("type") == "" && (show == nil || show.ChildrenCount() == 0) { //онлаен тип
- hookExec.NewEvent(hookexecutor.IncomingEvent{"presence", map[string]string{"sender": sender, "user": user}})
- }
- }
- }
- default:
- log.Println(reflect.TypeOf(e))
- }
- }), 0)
- }
- }
|