add devbot

This commit is contained in:
erinn 2020-11-09 15:24:09 -08:00
parent 26404203f9
commit aeeb3f0d23
1 changed files with 142 additions and 0 deletions

142
cmd/devbot/main.go Normal file
View File

@ -0,0 +1,142 @@
package main
import (
"cwtch.im/cwtch/event"
"cwtch.im/cwtch/model"
"cwtch.im/cwtch/protocol/connections"
"encoding/json"
"fmt"
"git.openprivacy.ca/openprivacy/log"
"git.openprivacy.ca/sarah/cwtchbot"
"github.com/araddon/dateparse"
"math/rand"
"os/user"
"path"
"strings"
"time"
)
var cwtchbot *bot.CwtchBot
type OverlayEnvelope struct {
onion string
Overlay int `json:"o"`
Data string `json:"d"`
}
func Unwrap(onion, msg string) *OverlayEnvelope {
var envelope OverlayEnvelope
err := json.Unmarshal([]byte(msg), &envelope)
if err != nil {
log.Errorf("json error: %v", err)
return nil
}
envelope.onion = onion
return &envelope
}
func (this *OverlayEnvelope) reply(msg string) {
retenv := OverlayEnvelope{Overlay:1, Data:msg}
raw, _ := json.Marshal(retenv)
log.Debugf("sending %v to %v", string(raw), this.onion)
cwtchbot.Peer.SendMessageToPeer(this.onion, string(raw))
}
func (this *OverlayEnvelope) spam() {
for {
this.reply(fmt.Sprintf("%d", rand.Int()))
}
}
func helpMessage() string {
return "help\nevery\nin\nat\nspam\nstop"
}
func main() {
user, _ := user.Current()
log.SetLevel(log.LevelInfo)
cwtchbot = bot.NewCwtchBot(path.Join(user.HomeDir, "/.echobot/"), "echobot")
cwtchbot.Launch()
for {
log.Infof("Process.....\n")
message := cwtchbot.Queue.Next()
switch message.EventType {
case event.NewMessageFromGroup:
if message.Data[event.RemotePeer] != cwtchbot.Peer.GetOnion() {
log.Infof("New Message: %v\v", message.Data[event.Data])
cwtchbot.Peer.SendMessageToGroup(message.Data[event.GroupID], message.Data[event.Data])
}
case event.NewMessageFromPeer:
log.Infof("New Event: %v", message)
cwtchbot.Queue.Publish(event.NewEvent(event.PeerAcknowledgement, map[event.Field]string{event.EventID: message.EventID, event.RemotePeer: message.Data[event.RemotePeer]}))
envelope := Unwrap(message.Data[event.RemotePeer], message.Data[event.Data])
mainTimer := time.NewTimer(time.Nanosecond)
if envelope.Overlay == 1 {
cmd := strings.Split(envelope.Data, " ")
switch cmd[0] {
case "help":
envelope.reply(helpMessage())
case "every":
interval, err := time.ParseDuration(cmd[1])
if err != nil {
envelope.reply(fmt.Sprintf("parse error: %s", err))
continue
}
envelope.reply("you got it!")
mainTimer.Stop()
mainTimer = time.AfterFunc(interval, func() {
envelope.reply(cmd[2])
mainTimer.Reset(interval)
})
case "in":
interval, err := time.ParseDuration(cmd[1])
if err != nil {
envelope.reply(fmt.Sprintf("parse error: %s", err))
continue
}
envelope.reply("will do!")
mainTimer.Stop()
mainTimer = time.AfterFunc(interval, func() {
envelope.reply(cmd[2])
})
case "at":
at, err := dateparse.ParseAny(cmd[1])
if err != nil {
envelope.reply(fmt.Sprintf("parse error: %s", err))
continue
}
envelope.reply(fmt.Sprintf("ok, sending at %v", at))
mainTimer.Stop()
interval := time.Until(at)
time.AfterFunc(interval, func() {
envelope.reply(cmd[2])
})
case "spam":
envelope.reply("lol ok you asked for it!")
mainTimer.Stop()
mainTimer = time.AfterFunc(time.Nanosecond, func() {
envelope.reply(fmt.Sprintf("%d", rand.Int()))
mainTimer.Reset(time.Nanosecond)
})
default:
envelope.reply("unrecognized command")
}
} else {
log.Warnf("unknown overlay type %d", envelope.Overlay)
}
case event.PeerStateChange:
state := message.Data[event.ConnectionState]
if state == connections.ConnectionStateName[connections.AUTHENTICATED] {
log.Infof("Auto approving stranger %v", message.Data[event.RemotePeer])
cwtchbot.Peer.AddContact("stranger", message.Data[event.RemotePeer], model.AuthApproved)
}
default:
log.Infof("New Event: %v", message)
}
}
}