@@ 0,0 1,120 @@
+package main
+
+import (
+ "bufio"
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "os"
+
+ "github.com/kyoh86/xdg"
+ "maunium.net/go/mautrix"
+ "maunium.net/go/mautrix/id"
+)
+
+type Data struct {
+ Homeserver string `json:"homeserver"`
+ Username string `json:"username"`
+ AccessToken string `json:"access_token"`
+ DeviceID id.DeviceID `json:"device_id"`
+ UserID id.UserID `json:"user_id"`
+}
+
+var dataFname = xdg.DataHome() + "/tallyard/data.json"
+
+func GetData() (data *Data, err error) {
+ if _, err = os.Stat(dataFname); os.IsNotExist(err) {
+ data, err = InquireForData()
+ if err == nil {
+ data.Save()
+ }
+ return data, err
+ }
+
+ jsonBytes, err := ioutil.ReadFile(dataFname)
+ if err != nil {
+ return nil, fmt.Errorf("error reading data file %s: %s", dataFname, err)
+ }
+
+ data = &Data{}
+ err = json.Unmarshal(jsonBytes, data)
+ if err != nil {
+ return nil, fmt.Errorf("error unmarshalling data file: %s", err)
+ }
+
+ return data, nil
+}
+
+func stripNewline(s string) string {
+ if s == "" {
+ return s
+ }
+ if s[len(s)-1] == '\n' {
+ return s[:len(s)-1]
+ }
+ return s
+}
+
+func InquireForData() (data *Data, err error) {
+ var (
+ password string
+ reader = bufio.NewReader(os.Stdin)
+ )
+
+ data = &Data{}
+
+ for data.Homeserver == "" || data.Homeserver == "\n" {
+ fmt.Print("enter homeserver: ")
+ data.Homeserver, err = reader.ReadString('\n')
+ if err != nil {
+ return nil, fmt.Errorf("error reading homeserver: %s", err)
+ }
+ }
+ data.Homeserver = stripNewline(data.Homeserver)
+
+ for data.Username == "" || data.Username == "\n" {
+ fmt.Print("enter username: ")
+ data.Username, err = reader.ReadString('\n')
+ if err != nil {
+ return nil, fmt.Errorf("error reading username: %s", err)
+ }
+ }
+ data.Username = stripNewline(data.Username)
+
+ for password == "" || password == "\n" {
+ fmt.Print("enter password: ")
+ password, err = reader.ReadString('\n')
+ if err != nil {
+ return nil, fmt.Errorf("error reading password: %s", err)
+ }
+ }
+ password = stripNewline(password)
+
+ client, err := mautrix.NewClient(data.Homeserver, "", "")
+ if err != nil {
+ return nil, fmt.Errorf("error creating mautrix client: %s", err)
+ }
+ respLogin, err := client.Login(&mautrix.ReqLogin{
+ Type: "m.login.password",
+ Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: data.Username},
+ Password: password,
+ StoreCredentials: true,
+ })
+ if err != nil {
+ return nil, fmt.Errorf("error logging in with given credentials: %s", err)
+ }
+
+ data.AccessToken = respLogin.AccessToken
+ data.DeviceID = respLogin.DeviceID
+ data.UserID = respLogin.UserID
+
+ return data, nil
+}
+
+func (data *Data) Save() error {
+ jsonBytes, err := json.Marshal(*data)
+ if err != nil {
+ return err
+ }
+ return ioutil.WriteFile(dataFname, jsonBytes, 0600)
+}
@@ 1,69 1,14 @@
package main
import (
- "bufio"
- "encoding/json"
"fmt"
- "io/ioutil"
"os"
-
- "github.com/kyoh86/xdg"
- "maunium.net/go/mautrix"
- "maunium.net/go/mautrix/id"
)
-type Data struct {
- Homeserver string `json:"homeserver"`
- Username string `json:"username"`
- AccessToken string `json:"access_token"`
- DeviceID id.DeviceID `json:"device_id"`
- UserID id.UserID `json:"user_id"`
-}
-
func main() {
- fname := xdg.DataHome() + "/tallyard/data.json"
- jsonBytes, err := ioutil.ReadFile(fname)
- if err != nil {
- fmt.Fprintf(os.Stderr, "error reading data file %s: %s\n", fname, err)
- os.Exit(1)
- }
-
- var data Data
- err = json.Unmarshal(jsonBytes, &data)
- if err != nil {
- fmt.Fprintf(os.Stderr, "error unmarshalling data file: %s\n", err)
- os.Exit(1)
- }
-
- fmt.Printf("homeserver: %s\n", data.Homeserver)
- fmt.Printf("username: %s\n", data.Username)
-
- reader := bufio.NewReader(os.Stdin)
- var password string
- for password == "" || password == "\n" {
- fmt.Print("enter password: ")
- password, err = reader.ReadString('\n')
- if err != nil {
- panic(err)
- }
- }
-
- if password[len(password)-1] == '\n' {
- password = password[:len(password)-1]
- }
-
- fmt.Printf("password: \"%s\"\n", password)
-
- client, err := mautrix.NewClient(data.Homeserver, "", "")
- respLogin, err := client.Login(&mautrix.ReqLogin{
- Type: "m.login.password",
- Identifier: mautrix.UserIdentifier{Type: mautrix.IdentifierTypeUser, User: data.Username},
- Password: password,
- StoreCredentials: true,
- })
+ data, err := GetData()
if err != nil {
- panic(err)
+ fmt.Fprintln(os.Stderr, err)
}
-
- fmt.Println(respLogin)
+ fmt.Println(data)
}