1
0
Fork 0
clipboard-sync/main.go

100 lines
2.3 KiB
Go
Raw Permalink Normal View History

2018-08-30 12:36:03 +00:00
package main
import (
2018-08-31 02:04:59 +00:00
"encoding/base64"
2018-08-30 12:36:03 +00:00
"flag"
"fmt"
"net/http"
"strconv"
"time"
"yumc.pw/cloud/clipboard-sync/lib/clipboard"
)
func main() {
t := flag.String("t", "c", "Type c(client) or s(server)")
a := flag.String("a", "http://127.0.0.1:8080", "Server Address")
b := flag.String("b", ":8080", "Server Listen Port")
flag.Parse()
if *t == "c" {
if clipboard.Unsupported {
panic("Unsupported On This Machine")
}
2018-09-05 02:28:38 +00:00
syncClipboard(*a)
2018-08-30 12:36:03 +00:00
} else {
startServer(*b)
}
}
const (
2018-08-30 14:04:24 +00:00
textHeader = "Go-Clipboard-Text"
timeHeader = "Go-Clipboard-Time"
2018-08-30 12:36:03 +00:00
)
func startServer(b string) {
text := ""
time := time.Now().Unix()
2018-09-05 02:28:38 +00:00
http.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) {
switch req.Method {
case "GET":
resp.Header().Add(textHeader, text)
resp.Header().Add(timeHeader, strconv.FormatInt(time, 10))
break
case "POST":
text = req.Header.Get(textHeader)
time, _ = strconv.ParseInt(req.Header.Get(timeHeader), 10, 64)
fmt.Printf("Client %s Update Clipboard...\n", req.RemoteAddr)
break
}
2018-08-30 12:36:03 +00:00
})
2018-09-05 02:28:38 +00:00
fmt.Println("Start Server Listen On: " + b)
http.ListenAndServe(b, nil)
2018-08-30 12:36:03 +00:00
}
2018-09-05 02:28:38 +00:00
func syncClipboard(a string) {
2018-08-30 12:36:03 +00:00
old, _ := clipboard.ReadAll()
updateTime := time.Now().Unix()
client := &http.Client{}
2018-09-05 02:28:38 +00:00
address := a
fmt.Printf("Start Client Connect to Server %s\n", address)
2018-08-30 12:36:03 +00:00
for {
time.Sleep(100 * time.Millisecond)
text, _ := clipboard.ReadAll()
if old != text {
old = text
updateTime = time.Now().Unix()
2018-09-05 02:28:38 +00:00
request, _ := http.NewRequest("POST", address, nil)
request.Header.Add(textHeader, encode(text))
request.Header.Add(timeHeader, strconv.FormatInt(updateTime, 10))
2018-08-30 12:36:03 +00:00
client.Do(request)
} else {
2018-09-05 02:28:38 +00:00
response, err := http.Get(a)
if err != nil {
time.Sleep(1000 * time.Millisecond)
2018-11-09 01:19:00 +00:00
fmt.Printf("Http Request Error: %s\n", err.Error())
2018-09-05 02:28:38 +00:00
continue
}
2018-08-30 14:04:24 +00:00
texts, ok := response.Header[textHeader]
2018-08-30 12:36:03 +00:00
if ok {
2018-08-31 02:04:59 +00:00
sText := decode(texts[0])
2018-08-30 14:04:24 +00:00
sTime, _ := strconv.ParseInt(response.Header[timeHeader][0], 10, 64)
if sTime > updateTime && sText != old {
2018-08-30 12:36:03 +00:00
old = sText
2018-08-30 14:16:18 +00:00
updateTime = sTime
2018-08-30 12:36:03 +00:00
clipboard.WriteAll(sText)
2018-09-05 02:28:38 +00:00
fmt.Printf("Update Clipboard: %s\n", sText)
2018-08-30 12:36:03 +00:00
}
}
}
}
}
2018-08-31 02:04:59 +00:00
func encode(text string) string {
return base64.URLEncoding.EncodeToString([]byte(text))
}
func decode(text string) string {
origin, _ := base64.URLEncoding.DecodeString(text)
return string(origin)
}