to internal logger for levels, all encompassing path

master
bel 2022-01-17 18:16:23 -07:00
parent e660f2ef9f
commit 73ccc22fd5
9 changed files with 179 additions and 55 deletions

View File

@ -3,7 +3,7 @@ package broker
import ( import (
"fmt" "fmt"
"local/truckstop/config" "local/truckstop/config"
"log" "local/truckstop/logtr"
"strings" "strings"
"time" "time"
) )
@ -65,7 +65,7 @@ func (j Job) FormatMultilineText() string {
out := "" out := ""
clients := config.Clients(j.Pickup.Date) clients := config.Clients(j.Pickup.Date)
for k := range clients { for k := range clients {
log.Printf("job multiline: %+v contains %s then use %v", clients[k].States, j.Pickup.State, k) logtr.Debugf("job multiline: %+v contains %s then use %v", clients[k].States, j.Pickup.State, k)
if strings.Contains(fmt.Sprint(clients[k].States), j.Pickup.State) { if strings.Contains(fmt.Sprint(clients[k].States), j.Pickup.State) {
if len(out) > 0 { if len(out) > 0 {
out += "\n" out += "\n"

View File

@ -8,7 +8,7 @@ import (
"io" "io"
"io/ioutil" "io/ioutil"
"local/truckstop/config" "local/truckstop/config"
"log" "local/truckstop/logtr"
"net/http" "net/http"
"time" "time"
) )
@ -120,7 +120,7 @@ func (ntg NTGVision) searchJob(id int64) (io.ReadCloser, error) {
} }
defer resp.Body.Close() defer resp.Body.Close()
b, _ := ioutil.ReadAll(resp.Body) b, _ := ioutil.ReadAll(resp.Body)
log.Printf("fetch ntg job info %+v: %d: %s", request, resp.StatusCode, b) logtr.Debugf("fetch ntg job info %+v: %d: %s", request, resp.StatusCode, b)
if resp.StatusCode > 400 && resp.StatusCode < 500 && resp.StatusCode != 404 && resp.StatusCode != 410 { if resp.StatusCode > 400 && resp.StatusCode < 500 && resp.StatusCode != 404 && resp.StatusCode != 410 {
return nil, ErrNoAuth return nil, ErrNoAuth
} }
@ -149,7 +149,7 @@ func (ntgJob *ntgVisionJob) Job() Job {
secrets: func() interface{} { secrets: func() interface{} {
jobInfo, err := ntgJob.JobInfo() jobInfo, err := ntgJob.JobInfo()
if err != nil { if err != nil {
log.Printf("failed to get jobinfo: %v", err) logtr.Errorf("failed to get jobinfo: %v", err)
return nil return nil
} }
return jobInfo.String() return jobInfo.String()
@ -199,7 +199,7 @@ func (ntg NTGVision) Search(states []config.State) ([]Job, error) {
return nil, err return nil, err
} }
log.Printf("ntg search for %+v: %s", states, b) logtr.Debugf("ntg search for %+v: %s", states, b)
var ntgjobs []ntgVisionJob var ntgjobs []ntgVisionJob
err = json.Unmarshal(b, &ntgjobs) err = json.Unmarshal(b, &ntgjobs)
@ -243,7 +243,7 @@ func (ntg NTGVision) search(states []config.State) (io.ReadCloser, error) {
} }
func (ntg NTGVision) refreshAuth() error { func (ntg NTGVision) refreshAuth() error {
log.Printf("refreshing ntg auth...") logtr.Infof("refreshing ntg auth...")
b, _ := json.Marshal(map[string]string{ b, _ := json.Marshal(map[string]string{
"username": config.Get().Brokers.NTG.Username, "username": config.Get().Brokers.NTG.Username,
"password": config.Get().Brokers.NTG.Password, "password": config.Get().Brokers.NTG.Password,

View File

@ -1,4 +1,8 @@
{ {
"Log": {
"Path": "/tmp/truckstop.log",
"Level": "err"
},
"Interval": { "Interval": {
"Input": "5s..10s", "Input": "5s..10s",
"OK": "6h0m0s..6h0m0s", "OK": "6h0m0s..6h0m0s",
@ -21,7 +25,7 @@
"Pickup": false, "Pickup": false,
"Dropoff": false, "Dropoff": false,
"Pathed": { "Pathed": {
"Enabled": true, "Enabled": false,
"DirectionsURIFormat": "https://maps.googleapis.com/maps/api/directions/json?origin=%s\u0026destination=%s\u0026mode=driving\u0026key=AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg", "DirectionsURIFormat": "https://maps.googleapis.com/maps/api/directions/json?origin=%s\u0026destination=%s\u0026mode=driving\u0026key=AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg",
"PathedURIFormat": "https://maps.googleapis.com/maps/api/staticmap?size=250x250\u0026path=%s\u0026format=jpeg\u0026maptype=roadmap\u0026key=AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg\u0026size=250x250\u0026markers=%s|%s", "PathedURIFormat": "https://maps.googleapis.com/maps/api/staticmap?size=250x250\u0026path=%s\u0026format=jpeg\u0026maptype=roadmap\u0026key=AIzaSyBkACm-LQkoSfsTO5_XAzBVZE9-JQzcNkg\u0026size=250x250\u0026markers=%s|%s",
"Zoom": { "Zoom": {
@ -48,7 +52,7 @@
"Message": { "Message": {
"Matrix": { "Matrix": {
"ReceiveEnabled": true, "ReceiveEnabled": true,
"Mock": false, "Mock": true,
"Homeserver": "https://m.bltrucks.top", "Homeserver": "https://m.bltrucks.top",
"Username": "@bot.m.bltrucks.top", "Username": "@bot.m.bltrucks.top",
"Token": "mvDWB96KXMF8XhOam8EC5XVdQvSEw0CDeClcSWocBcYkwZX3FPNWZ5uOnQk2EmT1cjpzfeuD7gDYPPjOuyZlI3bE9TE35UjNOlZgi0Tugm25s91iVsbIF6kMZsCIhVMSmEf6w3jxX6wQYOWvmDZ4mu6f5c8wr221EMDcOpEzQV09d1zuBSWgKLBgjqAkYHJZ5dTRIWpEDpPgujhOFZa2ld1HiAOxrJKlIrlfDBN0CUsTlGOGplujDAr4VtpFzNRS", "Token": "mvDWB96KXMF8XhOam8EC5XVdQvSEw0CDeClcSWocBcYkwZX3FPNWZ5uOnQk2EmT1cjpzfeuD7gDYPPjOuyZlI3bE9TE35UjNOlZgi0Tugm25s91iVsbIF6kMZsCIhVMSmEf6w3jxX6wQYOWvmDZ4mu6f5c8wr221EMDcOpEzQV09d1zuBSWgKLBgjqAkYHJZ5dTRIWpEDpPgujhOFZa2ld1HiAOxrJKlIrlfDBN0CUsTlGOGplujDAr4VtpFzNRS",
@ -56,7 +60,7 @@
"Room": "!OYZqtInrBCn1cyz90D:m.bltrucks.top" "Room": "!OYZqtInrBCn1cyz90D:m.bltrucks.top"
} }
}, },
"Once": false, "Once": true,
"Brokers": { "Brokers": {
"NTG": { "NTG": {
"JobInfo": true, "JobInfo": true,

View File

@ -4,12 +4,17 @@ import (
"encoding/json" "encoding/json"
"io/ioutil" "io/ioutil"
"local/storage" "local/storage"
"local/truckstop/logtr"
"os" "os"
"sync" "sync"
"time" "time"
) )
type Config struct { type Config struct {
Log struct {
Path string
Level logtr.Level
}
Interval struct { Interval struct {
Input Duration Input Duration
OK Duration OK Duration
@ -121,6 +126,8 @@ func Refresh() error {
if err := json.Unmarshal(b, &c); err != nil { if err := json.Unmarshal(b, &c); err != nil {
return err return err
} }
logtr.SetLogpath(c.Log.Path)
logtr.SetLevel(c.Log.Level)
if live.db != nil { if live.db != nil {
live.db.Close() live.db.Close()
} }

113
logtr/log.go Normal file
View File

@ -0,0 +1,113 @@
package logtr
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
"strings"
"sync"
"time"
)
type Level int
const (
VERBOSE = Level(7)
DEBUG = Level(8)
INFO = Level(9)
ERROR = Level(10)
)
func (l Level) MarshalJSON() ([]byte, error) {
return json.Marshal(l.String())
}
func (l *Level) UnmarshalJSON(b []byte) error {
var s string
if err := json.Unmarshal(b, &s); err != nil {
return err
}
s = strings.TrimSpace(s)
s = strings.ToUpper(s)
if len(s) > 3 {
s = s[:3]
}
for i := 0; i < int(ERROR)+5; i++ {
l2 := Level(i)
if l2.String() == s {
*l = l2
return nil
}
}
return errors.New("unknown log level: " + s)
}
var logger io.Writer = os.Stderr
var loggerPath string = ""
var lock = &sync.Mutex{}
var level Level = INFO
func SetLogpath(p string) {
lock.Lock()
defer lock.Unlock()
if p == loggerPath {
return
}
f, err := os.OpenFile(p, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
panic(err)
}
logger = f
loggerPath = p
}
func SetLevel(l Level) {
level = l
}
func logf(l Level, format string, args []interface{}) {
format = fmt.Sprintf("%v: %v: %s\n", time.Now().Format("15:04:05"), l.String(), strings.TrimSpace(format))
lock.Lock()
defer lock.Unlock()
if level <= l {
fmt.Fprintf(os.Stderr, format, args...)
}
fmt.Fprintf(logger, format, args...)
}
func Infof(format string, args ...interface{}) {
logf(INFO, format, args)
}
func Printf(format string, args ...interface{}) {
Infof(format, args...)
}
func Debugf(format string, args ...interface{}) {
logf(DEBUG, format, args)
}
func Verbosef(format string, args ...interface{}) {
logf(VERBOSE, format, args)
}
func Errorf(format string, args ...interface{}) {
logf(ERROR, format, args)
}
func (l Level) String() string {
switch l {
case ERROR:
return "ERR"
case INFO:
return "INF"
case DEBUG:
return "DEB"
case VERBOSE:
return "VER"
default:
return "?"
}
}

64
main.go
View File

@ -7,8 +7,8 @@ import (
"local/storage" "local/storage"
"local/truckstop/broker" "local/truckstop/broker"
"local/truckstop/config" "local/truckstop/config"
"local/truckstop/logtr"
"local/truckstop/message" "local/truckstop/message"
"log"
"net/http" "net/http"
"net/url" "net/url"
"regexp" "regexp"
@ -34,12 +34,12 @@ func main() {
for { for {
time.Sleep(config.Get().Interval.Input.Get()) time.Sleep(config.Get().Interval.Input.Get())
if err := config.Refresh(); err != nil { if err := config.Refresh(); err != nil {
log.Println(err) logtr.Errorf("failed parsing config: %v", err)
} else { } else {
if config.Get().Message.Matrix.ReceiveEnabled { if config.Get().Message.Matrix.ReceiveEnabled {
lock.Lock() lock.Lock()
if err := matrixrecv(); err != nil { if err := matrixrecv(); err != nil {
log.Print(err) logtr.Errorf("failed receiving and parsing matrix: %v", err)
} }
lock.Unlock() lock.Unlock()
} }
@ -53,15 +53,15 @@ func main() {
} }
func matrixrecv() error { func matrixrecv() error {
log.Printf("checking matrix...") logtr.Debugf("checking matrix...")
defer log.Printf("/checking matrix...") defer logtr.Debugf("/checking matrix...")
sender := message.NewMatrix() sender := message.NewMatrix()
messages, err := sender.Receive() messages, err := sender.Receive()
if err != nil { if err != nil {
return err return err
} }
func() { func() {
log.Printf("looking for help") logtr.Debugf("looking for help")
printed := false printed := false
for _, msg := range messages { for _, msg := range messages {
if !strings.HasPrefix(msg.Content, "!help") { if !strings.HasPrefix(msg.Content, "!help") {
@ -71,26 +71,26 @@ func matrixrecv() error {
db := config.Get().DB() db := config.Get().DB()
if !printed { if !printed {
if _, err := db.Get(key); err == storage.ErrNotFound { if _, err := db.Get(key); err == storage.ErrNotFound {
log.Printf("sending help") logtr.Debugf("sending help")
help := fmt.Sprintf("commands:\n...`!help` print this help\n...`!state nc NC nC Nc` set states for self\n...`!available 2022-12-31` set date self is available for work\n\nrun a command for someone else: `!state ga @caleb`") help := fmt.Sprintf("commands:\n...`!help` print this help\n...`!state nc NC nC Nc` set states for self\n...`!available 2022-12-31` set date self is available for work\n\nrun a command for someone else: `!state ga @caleb`")
if err := sender.Send(help); err != nil { if err := sender.Send(help); err != nil {
log.Printf("failed to send help: %v", err) logtr.Errorf("failed to send help: %v", err)
} else { } else {
printed = true printed = true
if err := db.Set(key, []byte{'k'}); err != nil { if err := db.Set(key, []byte{'k'}); err != nil {
log.Printf("failed to mark help given @%s: %v", key, err) logtr.Errorf("failed to mark help given @%s: %v", key, err)
} }
} }
} }
} else { } else {
if err := db.Set(key, []byte{'k'}); err != nil { if err := db.Set(key, []byte{'k'}); err != nil {
log.Printf("failed to mark help given @%s: %v", key, err) logtr.Errorf("failed to mark help given @%s: %v", key, err)
} }
} }
} }
}() }()
func() { func() {
log.Printf("looking for states") logtr.Debugf("looking for states")
db := config.Get().DB() db := config.Get().DB()
states := map[string]map[config.State]struct{}{} states := map[string]map[config.State]struct{}{}
for _, msg := range messages { for _, msg := range messages {
@ -108,13 +108,13 @@ func matrixrecv() error {
} }
} }
if err := db.Set(key, []byte{'k'}); err != nil { if err := db.Set(key, []byte{'k'}); err != nil {
log.Printf("failed to mark state gathered @%s: %v", key, err) logtr.Errorf("failed to mark state gathered @%s: %v", key, err)
} }
} }
setNewStates(states) setNewStates(states)
}() }()
func() { func() {
log.Printf("looking for pauses") logtr.Debugf("looking for pauses")
db := config.Get().DB() db := config.Get().DB()
pauses := map[string]time.Time{} pauses := map[string]time.Time{}
for _, msg := range messages { for _, msg := range messages {
@ -136,7 +136,7 @@ func matrixrecv() error {
} }
} }
if err := db.Set(key, []byte{'k'}); err != nil { if err := db.Set(key, []byte{'k'}); err != nil {
log.Printf("failed to mark state gathered @%s: %v", key, err) logtr.Errorf("failed to mark state gathered @%s: %v", key, err)
} }
} }
setNewPauses(pauses) setNewPauses(pauses)
@ -149,7 +149,7 @@ func setNewPauses(pauses map[string]time.Time) {
if len(pauses) == 0 { if len(pauses) == 0 {
return return
} }
log.Printf("set new pauses: %+v", pauses) logtr.Debugf("set new pauses: %+v", pauses)
conf := *config.Get() conf := *config.Get()
changed := map[string]time.Time{} changed := map[string]time.Time{}
for client, pause := range pauses { for client, pause := range pauses {
@ -164,11 +164,11 @@ func setNewPauses(pauses map[string]time.Time) {
if len(changed) == 0 { if len(changed) == 0 {
return return
} }
log.Printf("updating config new pauses: %+v", conf) logtr.Infof("updating config new pauses: %+v", conf)
config.Set(conf) config.Set(conf)
for client, pause := range changed { for client, pause := range changed {
if err := sendNewPause(client, pause); err != nil { if err := sendNewPause(client, pause); err != nil {
log.Printf("failed to send new pause %s/%+v: %v", client, pause, err) logtr.Errorf("failed to send new pause %s/%+v: %v", client, pause, err)
} }
} }
} }
@ -199,11 +199,11 @@ func setNewStates(states map[string]map[config.State]struct{}) {
if len(changed) == 0 { if len(changed) == 0 {
return return
} }
log.Printf("updating config new states: %+v", conf) logtr.Infof("updating config new states: %+v", conf)
config.Set(conf) config.Set(conf)
for client, states := range changed { for client, states := range changed {
if err := sendNewStates(client, states); err != nil { if err := sendNewStates(client, states); err != nil {
log.Printf("failed to send new states %s/%+v: %v", client, states, err) logtr.Errorf("failed to send new states %s/%+v: %v", client, states, err)
} }
} }
} }
@ -230,7 +230,7 @@ func _main() error {
for { for {
err := _mainOne() err := _mainOne()
if err != nil { if err != nil {
log.Println(err) logtr.Errorf("failed _main: %v", err)
} }
if config.Get().Once { if config.Get().Once {
time.Sleep(time.Second) time.Sleep(time.Second)
@ -246,15 +246,15 @@ func _main() error {
} }
func _mainOne() error { func _mainOne() error {
log.Println("config.refreshing...") logtr.Debugf("config.refreshing...")
if err := config.Refresh(); err != nil { if err := config.Refresh(); err != nil {
return err return err
} }
log.Println("once...") logtr.Debugf("once...")
if err := once(); err != nil { if err := once(); err != nil {
return err return err
} }
log.Println("/_mainOne") logtr.Debugf("/_mainOne")
return nil return nil
} }
@ -263,26 +263,26 @@ func once() error {
if err != nil { if err != nil {
return err return err
} }
log.Printf("once: all jobs: %+v", alljobs) logtr.Debugf("once: all jobs: %+v", alljobs)
newjobs, err := dropStaleJobs(alljobs) newjobs, err := dropStaleJobs(alljobs)
if err != nil { if err != nil {
return err return err
} }
log.Printf("once: new jobs: %+v", newjobs) logtr.Debugf("once: new jobs: %+v", newjobs)
jobs, err := dropBanlistJobs(newjobs) jobs, err := dropBanlistJobs(newjobs)
if err != nil { if err != nil {
return err return err
} }
log.Printf("once: loading job secrets: %+v", jobs) logtr.Debugf("once: loading job secrets: %+v", jobs)
for i := range jobs { for i := range jobs {
jobs[i].Secrets() jobs[i].Secrets()
} }
log.Printf("once: sending jobs: %+v", jobs) logtr.Infof("once: sending jobs: %+v", jobs)
for i := range jobs { for i := range jobs {
if ok, err := sendJob(jobs[i]); err != nil { if ok, err := sendJob(jobs[i]); err != nil {
return err return err
} else if ok { } else if ok {
log.Println("sent job", jobs[i]) logtr.Debugf("sent job", jobs[i])
if err := config.Get().DB().Set(jobs[i].ID, []byte(`sent`)); err != nil { if err := config.Get().DB().Set(jobs[i].ID, []byte(`sent`)); err != nil {
return err return err
} }
@ -327,7 +327,7 @@ func dropBanlistJobs(jobs []broker.Job) ([]broker.Job, error) {
func sendJob(job broker.Job) (bool, error) { func sendJob(job broker.Job) (bool, error) {
sender := message.NewMatrix() sender := message.NewMatrix()
payload := job.FormatMultilineText() payload := job.FormatMultilineText()
log.Printf("once: send job %s if nonzero: %s", job.String(), payload) logtr.Debugf("once: send job %s if nonzero: %s", job.String(), payload)
if len(payload) == 0 { if len(payload) == 0 {
return false, nil return false, nil
} }
@ -390,7 +390,7 @@ func sendJob(job broker.Job) (bool, error) {
if maxLat-minLat <= maps.Pathed.Zoom.AcceptableLatLngDelta && maxLng-minLng <= maps.Pathed.Zoom.AcceptableLatLngDelta { if maxLat-minLat <= maps.Pathed.Zoom.AcceptableLatLngDelta && maxLng-minLng <= maps.Pathed.Zoom.AcceptableLatLngDelta {
uri = fmt.Sprintf("%s&zoom=%d", uri, maps.Pathed.Zoom.Override) uri = fmt.Sprintf("%s&zoom=%d", uri, maps.Pathed.Zoom.Override)
} }
log.Printf("sending pathed image: %s", uri) logtr.Debugf("sending pathed image: %s", uri)
if err := sender.SendImage(uri); err != nil { if err := sender.SendImage(uri); err != nil {
return true, err return true, err
} }
@ -398,14 +398,14 @@ func sendJob(job broker.Job) (bool, error) {
} }
if maps.Pickup { if maps.Pickup {
uri := fmt.Sprintf(maps.URIFormat, pickup, pickup) uri := fmt.Sprintf(maps.URIFormat, pickup, pickup)
log.Printf("sending pickup image: %s", uri) logtr.Debugf("sending pickup image: %s", uri)
if err := sender.SendImage(uri); err != nil { if err := sender.SendImage(uri); err != nil {
return true, err return true, err
} }
} }
if maps.Dropoff { if maps.Dropoff {
uri := fmt.Sprintf(maps.URIFormat, dropoff, dropoff) uri := fmt.Sprintf(maps.URIFormat, dropoff, dropoff)
log.Printf("sending dropoff image: %s", uri) logtr.Debugf("sending dropoff image: %s", uri)
if err := sender.SendImage(uri); err != nil { if err := sender.SendImage(uri); err != nil {
return true, err return true, err
} }

View File

@ -7,7 +7,7 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"local/truckstop/config" "local/truckstop/config"
"log" "local/truckstop/logtr"
"mime/multipart" "mime/multipart"
"net/http" "net/http"
"net/url" "net/url"
@ -40,7 +40,7 @@ func uploadImage(b []byte) (string, error) {
} else if s, ok := u.Query()["name"]; !ok { } else if s, ok := u.Query()["name"]; !ok {
} else { } else {
name = s[0] name = s[0]
log.Printf("found name in upload uri: %s", name) logtr.Debugf("found name in upload uri: %s", name)
} }
part, err := writer.CreateFormFile("image", name) part, err := writer.CreateFormFile("image", name)
if err != nil { if err != nil {

View File

@ -5,7 +5,7 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"local/truckstop/config" "local/truckstop/config"
"log" "local/truckstop/logtr"
"net/http" "net/http"
"regexp" "regexp"
"strings" "strings"
@ -45,7 +45,7 @@ func (m Matrix) Continuation() string {
func (m *Matrix) Receive() ([]Message, error) { func (m *Matrix) Receive() ([]Message, error) {
if m.mock { if m.mock {
log.Printf("matrix.Receive()") logtr.Infof("matrix.Receive()")
messages := make([]Message, 0) messages := make([]Message, 0)
for k := range config.Get().Clients { for k := range config.Get().Clients {
messages = append(messages, Message{Timestamp: time.Now(), Sender: k, Content: "!state nc"}) messages = append(messages, Message{Timestamp: time.Now(), Sender: k, Content: "!state nc"})
@ -75,10 +75,9 @@ func (m *Matrix) Receive() ([]Message, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
log.Printf("%s => {Start:%s End:%v};; %v, (%d)", m.Continuation(), result.Start, result.End, err, len(result.Chunk)) logtr.Debugf("%s => {Start:%s End:%v};; %v, (%d)", m.Continuation(), result.Start, result.End, err, len(result.Chunk))
m.continuation = result.End m.continuation = result.End
for _, event := range result.Chunk { for _, event := range result.Chunk {
//log.Printf("%+v", event)
if _, ok := matrixIDs[event.Sender]; !ok { if _, ok := matrixIDs[event.Sender]; !ok {
continue continue
} }
@ -91,7 +90,7 @@ func (m *Matrix) Receive() ([]Message, error) {
} }
} }
clientChange := regexp.MustCompile("@[a-z]+$") clientChange := regexp.MustCompile("@[a-z]+$")
log.Printf("rewriting messages based on @abc") logtr.Debugf("rewriting messages based on @abc")
for i := range messages { for i := range messages {
if found := clientChange.FindString(messages[i].Content); found != "" { if found := clientChange.FindString(messages[i].Content); found != "" {
messages[i].Content = strings.TrimSpace(strings.ReplaceAll(messages[i].Content, found, "")) messages[i].Content = strings.TrimSpace(strings.ReplaceAll(messages[i].Content, found, ""))
@ -105,7 +104,7 @@ func (m *Matrix) Receive() ([]Message, error) {
} }
messages[i].Content = strings.TrimSpace(messages[i].Content) messages[i].Content = strings.TrimSpace(messages[i].Content)
} }
log.Printf("rewriting messages based on ! CoMmAnD ...") logtr.Debugf("rewriting messages based on ! CoMmAnD ...")
for i := range messages { for i := range messages {
if strings.HasPrefix(messages[i].Content, "!") { if strings.HasPrefix(messages[i].Content, "!") {
messages[i].Content = "!" + strings.TrimSpace(messages[i].Content[1:]) messages[i].Content = "!" + strings.TrimSpace(messages[i].Content[1:])
@ -118,7 +117,7 @@ func (m *Matrix) Receive() ([]Message, error) {
func (m Matrix) Send(text string) error { func (m Matrix) Send(text string) error {
if m.mock { if m.mock {
log.Printf("matrix.Send(%s)", text) logtr.Infof("matrix.Send(%s)", text)
return nil return nil
} }
c, err := m.getclient() c, err := m.getclient()
@ -131,7 +130,7 @@ func (m Matrix) Send(text string) error {
func (m Matrix) SendImage(uri string) error { func (m Matrix) SendImage(uri string) error {
if m.mock { if m.mock {
log.Printf("matrix.SendImage(%s)", uri) logtr.Infof("matrix.SendImage(%s)", uri)
return nil return nil
} }
response, err := http.Get(uri) response, err := http.Get(uri)
@ -158,7 +157,7 @@ func (m Matrix) SendImage(uri string) error {
} }
publicURI := mediaUpload.ContentURI publicURI := mediaUpload.ContentURI
resp, err := c.SendImage(m.room, "img", publicURI) resp, err := c.SendImage(m.room, "img", publicURI)
log.Printf("sent image %s => %s: %+v", uri, publicURI, resp) logtr.Debugf("sent image %s => %s: %+v", uri, publicURI, resp)
return err return err
} }

View File

@ -1,6 +1,6 @@
todo: todo:
- help() log on truckstop for stuff like perma 403
- TEST its falling apart - TEST its falling apart
- figure out zoom on maps;; is there like an auto-zoom I can leverage?
- mark jobs no longer avail by modifying in matrix - mark jobs no longer avail by modifying in matrix
- write-as for clients so ma can write to pa by default - write-as for clients so ma can write to pa by default
- continuation is garbo, but I can still do better client side to avoid get-set high level - continuation is garbo, but I can still do better client side to avoid get-set high level
@ -15,6 +15,7 @@ todo:
- banlist criteria like vendors, brokers, metadata - banlist criteria like vendors, brokers, metadata
- set up copy for caleb, broc - set up copy for caleb, broc
done: done:
- figure out zoom on maps;; is there like an auto-zoom I can leverage?
- mock is nigh useless - mock is nigh useless
- mark consumed;; save scroll id for matrix - mark consumed;; save scroll id for matrix
- todo: switch house to selfhosted for rate limit - todo: switch house to selfhosted for rate limit