change adapter API, implement honk::do::post
This commit is contained in:
parent
9195bba7ed
commit
e3c1f9d54b
8 changed files with 155 additions and 13 deletions
|
@ -9,6 +9,6 @@ type Adapter interface {
|
||||||
Name() string
|
Name() string
|
||||||
Subscribe(string) []error
|
Subscribe(string) []error
|
||||||
Fetch(string, []string) error
|
Fetch(string, []string) error
|
||||||
Do(string, []string) error
|
Do(string, map[string]string) error
|
||||||
DefaultSubscriptionFilter() string
|
DefaultSubscriptionFilter() string
|
||||||
}
|
}
|
||||||
|
|
96
adapter/honk.go
Normal file
96
adapter/honk.go
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
package adapter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
. "forge.lightcrystal.systems/lightcrystal/underbbs/models"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HonkAdapter struct {
|
||||||
|
data *chan SocketData
|
||||||
|
nickname string
|
||||||
|
server string
|
||||||
|
username string
|
||||||
|
password string
|
||||||
|
token string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) send(data SocketData) {
|
||||||
|
if self.data != nil {
|
||||||
|
*self.data <- data
|
||||||
|
} else {
|
||||||
|
fmt.Fprintln(os.Stdout, string(data.ToDatagram()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) Name() string {
|
||||||
|
return self.nickname
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) Init(settings Settings, data *chan SocketData) error {
|
||||||
|
// separate name and server in handle
|
||||||
|
parts := strings.Split(*settings.Handle, "@")
|
||||||
|
self.username = parts[1]
|
||||||
|
self.server = "https://" + parts[2]
|
||||||
|
self.password = *settings.Password
|
||||||
|
self.nickname = settings.Nickname
|
||||||
|
// store all the settings
|
||||||
|
// make a request to get the token
|
||||||
|
r, err := http.PostForm(self.server+"/dologin", url.Values{
|
||||||
|
"username": []string{self.username},
|
||||||
|
"password": []string{self.password},
|
||||||
|
"gettoken": []string{"1"},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var buf [32]byte
|
||||||
|
_, err = r.Body.Read(buf[:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
self.token = string(buf[:])
|
||||||
|
fmt.Println(self.token)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) Subscribe(string) []error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) Fetch(etype string, ids []string) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) Do(action string, data map[string]string) error {
|
||||||
|
switch action {
|
||||||
|
case "post":
|
||||||
|
res, err := http.PostForm(self.server+"/api", url.Values{
|
||||||
|
"action": []string{"honk"},
|
||||||
|
"token": []string{self.token},
|
||||||
|
"noise": []string{data["content"]},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var buf [256]byte
|
||||||
|
_, err = res.Body.Read(buf[:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(string(buf[:]))
|
||||||
|
default:
|
||||||
|
return errors.New("Do: unknown action")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *HonkAdapter) DefaultSubscriptionFilter() string {
|
||||||
|
return ""
|
||||||
|
}
|
|
@ -104,7 +104,7 @@ func (self *MastoAdapter) Fetch(etype string, ids []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *MastoAdapter) Do(action string, data []string) error {
|
func (self *MastoAdapter) Do(action string, data map[string]string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -367,7 +367,7 @@ func (self *MisskeyAdapter) Fetch(etype string, ids []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *MisskeyAdapter) Do(action string, data []string) error {
|
func (self *MisskeyAdapter) Do(action string, data map[string]string) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ func (self *NostrAdapter) Fetch(etype string, ids []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *NostrAdapter) Do(action string, data []string) error {
|
func (self *NostrAdapter) Do(action string, data map[string]string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
51
cli/cli.go
51
cli/cli.go
|
@ -5,11 +5,40 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"forge.lightcrystal.systems/lightcrystal/underbbs/adapter"
|
"forge.lightcrystal.systems/lightcrystal/underbbs/adapter"
|
||||||
"forge.lightcrystal.systems/lightcrystal/underbbs/models"
|
"forge.lightcrystal.systems/lightcrystal/underbbs/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func GetConfigLocation() string {
|
||||||
|
home := os.Getenv("HOME")
|
||||||
|
appdata := os.Getenv("APPDATA")
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
return filepath.Join(appdata, "underbbs")
|
||||||
|
case "darwin":
|
||||||
|
return filepath.Join(home, "Library", "Application Support", "underbbs")
|
||||||
|
case "plan9":
|
||||||
|
return filepath.Join(home, "lib", "underbbs")
|
||||||
|
default:
|
||||||
|
return filepath.Join(home, ".config", "underbbs")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func EnsureConfigLocationExists() {
|
||||||
|
fileInfo, err := os.Stat(GetConfigLocation())
|
||||||
|
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
os.MkdirAll(GetConfigLocation(), os.ModePerm)
|
||||||
|
} else if !fileInfo.IsDir() {
|
||||||
|
panic("Config location is not a directory!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Process(args ...string) error {
|
func Process(args ...string) error {
|
||||||
// allocate storage for the settings array
|
// allocate storage for the settings array
|
||||||
var settings []models.Settings
|
var settings []models.Settings
|
||||||
|
@ -19,17 +48,20 @@ func Process(args ...string) error {
|
||||||
return errors.New("CLI requires at least 3 args: ADAPTER ACTION DATA...")
|
return errors.New("CLI requires at least 3 args: ADAPTER ACTION DATA...")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EnsureConfigLocationExists()
|
||||||
|
cfgdir := GetConfigLocation()
|
||||||
|
|
||||||
// get adapter from first arg
|
// get adapter from first arg
|
||||||
adapterName := args[0]
|
adapterName := args[0]
|
||||||
args = args[1:]
|
args = args[1:]
|
||||||
|
|
||||||
// get config from config fle based on adapter
|
// get config from config fle based on adapter
|
||||||
content, err := ioutil.ReadFile("./config.json")
|
content, err := ioutil.ReadFile(filepath.Join(cfgdir, "config.json"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = json.Unmarshal(content, settings)
|
err = json.Unmarshal(content, &settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -53,6 +85,8 @@ func Process(args ...string) error {
|
||||||
a = &adapter.MastoAdapter{}
|
a = &adapter.MastoAdapter{}
|
||||||
case "misskey":
|
case "misskey":
|
||||||
a = &adapter.MisskeyAdapter{}
|
a = &adapter.MisskeyAdapter{}
|
||||||
|
case "honk":
|
||||||
|
a = &adapter.HonkAdapter{}
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -63,7 +97,18 @@ func Process(args ...string) error {
|
||||||
case "fetch":
|
case "fetch":
|
||||||
a.Fetch(args[1], args[2:])
|
a.Fetch(args[1], args[2:])
|
||||||
case "do":
|
case "do":
|
||||||
a.Do(args[1], args[2:])
|
data := map[string]string{}
|
||||||
|
for _, a := range args[2:] {
|
||||||
|
if !strings.Contains(a, "=") {
|
||||||
|
return errors.New("args are in the form KEY=VALUE")
|
||||||
|
} else {
|
||||||
|
aa := strings.Split(a, "=")
|
||||||
|
k := aa[0]
|
||||||
|
v := strings.Join(aa[1:], "=")
|
||||||
|
data[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a.Do(args[1], data)
|
||||||
default:
|
default:
|
||||||
log.Print(args)
|
log.Print(args)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,4 +7,6 @@ type Settings struct {
|
||||||
Relays []string `json:"relays",omitempty`
|
Relays []string `json:"relays",omitempty`
|
||||||
Server *string `json:"server",omitempty`
|
Server *string `json:"server",omitempty`
|
||||||
ApiKey *string `json:"apiKey",omitempty`
|
ApiKey *string `json:"apiKey",omitempty`
|
||||||
|
Handle *string `json:"handle",omitempty`
|
||||||
|
Password *string `json:"password",omitempty`
|
||||||
}
|
}
|
||||||
|
|
11
underbbs.go
11
underbbs.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -21,23 +22,21 @@ func main() {
|
||||||
|
|
||||||
var err error = nil
|
var err error = nil
|
||||||
|
|
||||||
switch filepath.Base(args[0]) {
|
progname := filepath.Base(args[0])
|
||||||
|
switch progname {
|
||||||
case "underbbs-cli":
|
case "underbbs-cli":
|
||||||
err = run_cli(args[1:]...)
|
err = run_cli(args[1:]...)
|
||||||
break
|
|
||||||
default:
|
default:
|
||||||
err = run_srvr()
|
err = run_srvr()
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
fmt.Println(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func run_cli(args ...string) error {
|
func run_cli(args ...string) error {
|
||||||
cli.Process(args...)
|
return cli.Process(args...)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func run_srvr() error {
|
func run_srvr() error {
|
||||||
|
|
Loading…
Reference in a new issue