mirror of
https://github.com/andatoshiki/shikigrid.git
synced 2026-06-05 19:56:27 +00:00
179 lines
4.0 KiB
Go
179 lines
4.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/evilsocket/islazy/log"
|
|
"github.com/evilsocket/islazy/tui"
|
|
"github.com/andatoshiki/shikigrid/api"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"time"
|
|
)
|
|
|
|
func clearScreen() {
|
|
var what []string
|
|
if runtime.GOOS == "windows" {
|
|
what = []string{"cmd", "/c", "cls"}
|
|
} else {
|
|
what = []string{"clear", ""}
|
|
}
|
|
cmd := exec.Command(what[0], what[1:]...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Run()
|
|
}
|
|
|
|
func showInbox(server *api.API, box map[string]interface{}) {
|
|
messages := box["messages"].([]interface{})
|
|
numMessages := len(messages)
|
|
|
|
if numMessages > 0 {
|
|
if clear {
|
|
log.Info("clearing %d messages", numMessages)
|
|
for _, m := range messages {
|
|
msg := m.(map[string]interface{})
|
|
msgID := int(msg["id"].(float64))
|
|
log.Info("deleting message %d ...", msgID)
|
|
if _, err := server.Client.MarkInboxMessage(msgID, "deleted"); err != nil {
|
|
log.Error("%v", err)
|
|
}
|
|
}
|
|
} else {
|
|
records := box["records"].(float64)
|
|
pages := box["pages"].(float64)
|
|
columns := []string{
|
|
"ID",
|
|
"Date",
|
|
"Sender",
|
|
}
|
|
rows := [][]string{}
|
|
for _, m := range messages {
|
|
var row []string
|
|
msg := m.(map[string]interface{})
|
|
|
|
t, err := time.Parse(time.RFC3339, msg["created_at"].(string))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
row = []string{
|
|
fmt.Sprintf("%d", int(msg["id"].(float64))),
|
|
t.Format("02 January 2006, 3:04 PM"),
|
|
fmt.Sprintf("%s@%s", msg["sender_name"], msg["sender"]),
|
|
}
|
|
|
|
if msg["seen_at"] != nil {
|
|
for i := range row {
|
|
row[i] = tui.Dim(row[i])
|
|
}
|
|
}
|
|
|
|
rows = append(rows, row)
|
|
}
|
|
|
|
fmt.Println()
|
|
tui.Table(os.Stdout, columns, rows)
|
|
fmt.Println()
|
|
|
|
fmt.Printf("%d of %d (page %d of %d)", numMessages, int(records), page, int(pages))
|
|
}
|
|
} else {
|
|
fmt.Println()
|
|
fmt.Println(tui.Dim("Inbox is empty."))
|
|
}
|
|
|
|
fmt.Println()
|
|
}
|
|
|
|
func showMessage(msg map[string]interface{}) {
|
|
t, err := time.Parse(time.RFC3339, msg["created_at"].(string))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fmt.Println()
|
|
fmt.Printf("From: %s@%s\n", msg["sender_name"], msg["sender"])
|
|
fmt.Printf("Date: %s\n\n", t.Format("02 January 2006, 3:04 PM"))
|
|
if output == "" {
|
|
fmt.Printf("%s\n", msg["data"])
|
|
fmt.Println()
|
|
} else if err := ioutil.WriteFile(output, msg["data"].([]byte), os.ModePerm); err != nil {
|
|
log.Fatal("error writing to %s: %v", output, err)
|
|
} else {
|
|
log.Info("%s written", output)
|
|
}
|
|
}
|
|
|
|
func sendMessage() {
|
|
var err error
|
|
|
|
// send a message
|
|
var raw []byte
|
|
if message == "" {
|
|
log.Fatal("-message can not be empty")
|
|
} else if message[0] == '@' {
|
|
log.Info("reading %s ...", message[1:])
|
|
if raw, err = ioutil.ReadFile(message[1:]); err != nil {
|
|
log.Fatal("error reading %s: %v", message[1:], err)
|
|
}
|
|
} else {
|
|
raw = []byte(message)
|
|
}
|
|
|
|
if status, err := server.SendMessage(receiver, raw); err != nil {
|
|
log.Fatal("%d %v", status, err)
|
|
} else {
|
|
log.Info("message sent")
|
|
}
|
|
}
|
|
|
|
func doInbox(server *api.API) {
|
|
if receiver != "" {
|
|
sendMessage()
|
|
} else if inbox {
|
|
// just show the inbox
|
|
if id == 0 {
|
|
log.Info("fetching inbox ...")
|
|
if box, err := server.Client.Inbox(page); err != nil {
|
|
log.Fatal("%v", err)
|
|
} else {
|
|
showInbox(server, box)
|
|
}
|
|
} else if del {
|
|
log.Info("deleting message %d ...", id)
|
|
if _, err := server.Client.MarkInboxMessage(id, "deleted"); err != nil {
|
|
log.Fatal("%v", err)
|
|
}
|
|
} else if unread {
|
|
log.Info("marking message %d as unread ...", id)
|
|
if _, err := server.Client.MarkInboxMessage(id, "unseen"); err != nil {
|
|
log.Fatal("%v", err)
|
|
}
|
|
} else {
|
|
log.Info("fetching message %d ...", id)
|
|
|
|
if msg, status, err := server.InboxMessage(id); err != nil {
|
|
log.Fatal("%d %v", status, err)
|
|
} else {
|
|
showMessage(msg)
|
|
_, _ = server.Client.MarkInboxMessage(id, "seen")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func inboxMain() {
|
|
if inbox {
|
|
doInbox(server)
|
|
if loop {
|
|
ticker := time.NewTicker(time.Duration(loopPeriod) * time.Second)
|
|
for _ = range ticker.C {
|
|
clearScreen()
|
|
doInbox(server)
|
|
}
|
|
}
|
|
os.Exit(0)
|
|
}
|
|
}
|