bot.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "github.com/golang-cjr/xep/hookexecutor"
  4. "github.com/golang-cjr/xep/muc"
  5. "github.com/kpmy/xippo/c2s/actors"
  6. "github.com/kpmy/xippo/c2s/actors/steps"
  7. "github.com/kpmy/xippo/c2s/stream"
  8. "github.com/kpmy/xippo/entity"
  9. "github.com/kpmy/xippo/entity/dyn"
  10. "github.com/kpmy/xippo/units"
  11. "log"
  12. "reflect"
  13. "strings"
  14. )
  15. var hookExec *hookexecutor.Executor
  16. func bot(st stream.Stream) error {
  17. 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)
  18. hookExec = hookexecutor.NewExecutor(st)
  19. hookExec.Start()
  20. for {
  21. st.Ring(conv(func(_e entity.Entity) {
  22. switch e := _e.(type) {
  23. case *entity.Message:
  24. if strings.HasPrefix(e.From, ROOM+"/") && e.Body != "" {
  25. sender := strings.TrimPrefix(e.From, ROOM+"/")
  26. um := muc.UserMapping()
  27. user := sender
  28. if u, ok := um[sender]; ok {
  29. user, _ = u.(string)
  30. }
  31. if e.Type == entity.GROUPCHAT {
  32. room.Lock()
  33. if sender != ME {
  34. IncStat(user)
  35. IncStatLen(user, e.Body)
  36. room.Active(user)
  37. }
  38. room.Grow(Post{Nick: sender, User: user, Msg: e.Body})
  39. room.Unlock()
  40. }
  41. if sender != ME {
  42. words.Lock()
  43. Stem(e.Body)
  44. words.Unlock()
  45. }
  46. if sender != ME {
  47. hookExec.NewEvent(hookexecutor.IncomingEvent{"message", map[string]string{"sender": sender, "body": e.Body}})
  48. switch {
  49. case strings.EqualFold(strings.TrimSpace(e.Body), "пщ"):
  50. go func() {
  51. actors.With().Do(actors.C(doReply(sender, e.Type, "пщ!"))).Run(st)
  52. }()
  53. case strings.HasPrefix(e.Body, "xep"):
  54. body := strings.TrimPrefix(e.Body, "xep")
  55. body = strings.TrimSpace(body)
  56. if body != "" {
  57. go func() {
  58. actors.With().Do(actors.C(doReply(sender, entity.GROUPCHAT, body))).Run(st)
  59. }()
  60. }
  61. }
  62. }
  63. }
  64. case dyn.Entity:
  65. switch e.Type() {
  66. case dyn.PRESENCE:
  67. if from := e.Model().Attr("from"); from != "" && strings.HasPrefix(from, ROOM+"/") {
  68. sender := strings.TrimPrefix(from, ROOM+"/")
  69. um := muc.UserMapping()
  70. user := sender
  71. if u, ok := um[sender]; ok {
  72. user, _ = u.(string)
  73. }
  74. actors.With().Do(R(func(r *Room) (e error) {
  75. r.User(user)
  76. return
  77. })).Run(room)
  78. if show := firstByName(e.Model(), "show"); e.Model().Attr("type") == "" && (show == nil || show.ChildrenCount() == 0) { //онлаен тип
  79. hookExec.NewEvent(hookexecutor.IncomingEvent{"presence", map[string]string{"sender": sender, "user": user}})
  80. }
  81. }
  82. }
  83. default:
  84. log.Println(reflect.TypeOf(e))
  85. }
  86. }), 0)
  87. }
  88. }