add devbot #1
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue