removed dependencies
This commit is contained in:
parent
b457377a80
commit
b01a8ca13a
1
.gitignore
vendored
1
.gitignore
vendored
@ -0,0 +1 @@
|
|||||||
|
.idea
|
32
err.go
Normal file
32
err.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package scn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ErrorType string
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrAuthFailed ErrorType = "GOEXT_SCN_AUTHFAILED"
|
||||||
|
ErrQuota ErrorType = "GOEXT_SCN_QUOTAEXCEEDED"
|
||||||
|
ErrBadRequest ErrorType = "GOEXT_SCN_BADREQUEST"
|
||||||
|
ErrInternalServerErr ErrorType = "GOEXT_SCN_INTERNALSERVER"
|
||||||
|
ErrOther ErrorType = "GOEXT_SCN_OTHER"
|
||||||
|
)
|
||||||
|
|
||||||
|
type InternalError struct {
|
||||||
|
errType ErrorType
|
||||||
|
errorMessage string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewError(errType ErrorType, errMessage string) *InternalError {
|
||||||
|
return &InternalError{
|
||||||
|
errType: errType,
|
||||||
|
errorMessage: errMessage,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *InternalError) Build() error {
|
||||||
|
return errors.New(fmt.Sprintf("[%v]: %v", e.errType, e.errorMessage))
|
||||||
|
}
|
13
scn.go
Normal file
13
scn.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package scn
|
||||||
|
|
||||||
|
type Connection struct {
|
||||||
|
uid string
|
||||||
|
token string
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(userid string, token string) *Connection {
|
||||||
|
return &Connection{
|
||||||
|
uid: userid,
|
||||||
|
token: token,
|
||||||
|
}
|
||||||
|
}
|
161
send.go
Normal file
161
send.go
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
package scn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MessageResponse struct {
|
||||||
|
ErrHighlight int `json:"errhighlight"`
|
||||||
|
Error int `json:"error"`
|
||||||
|
IsPro bool `json:"is_pro"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
Messagecount int `json:"messagecount"`
|
||||||
|
Quota int `json:"quota"`
|
||||||
|
QuotaMax int `json:"quota_max"`
|
||||||
|
SCNMessageID string `json:"scn_msg_id"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
SuppressSend bool `json:"suppress_send"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MessageErrResponse struct {
|
||||||
|
Errhighlight int `json:"errhighlight"`
|
||||||
|
Error int `json:"error"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
Success bool `json:"success"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type MessageBuilder struct {
|
||||||
|
conn *Connection
|
||||||
|
title string
|
||||||
|
content *string
|
||||||
|
channel *string
|
||||||
|
time *time.Time
|
||||||
|
sendername *string
|
||||||
|
priority *int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Connection) Message(title string) *MessageBuilder {
|
||||||
|
return &MessageBuilder{conn: c, title: title}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MessageBuilder) Channel(channel string) *MessageBuilder {
|
||||||
|
c.channel = &channel
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MessageBuilder) Content(content string) *MessageBuilder {
|
||||||
|
c.content = &content
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MessageBuilder) Time(t time.Time) *MessageBuilder {
|
||||||
|
c.time = &t
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MessageBuilder) SenderName(sn string) *MessageBuilder {
|
||||||
|
c.sendername = &sn
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MessageBuilder) Priority(p int) *MessageBuilder {
|
||||||
|
c.priority = &p
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MessageBuilder) Send(ctx context.Context) (MessageResponse, error) {
|
||||||
|
client := http.Client{Timeout: 5 * time.Second}
|
||||||
|
|
||||||
|
body := map[string]interface{}{}
|
||||||
|
|
||||||
|
body["user_id"] = c.conn.uid
|
||||||
|
body["key"] = c.conn.token
|
||||||
|
|
||||||
|
if c.channel != nil {
|
||||||
|
body["channel"] = *c.channel
|
||||||
|
}
|
||||||
|
|
||||||
|
body["title"] = c.title
|
||||||
|
|
||||||
|
if c.content != nil {
|
||||||
|
body["content"] = *c.content
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.sendername != nil {
|
||||||
|
body["content"] = *c.sendername
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.time != nil {
|
||||||
|
body["timestamp"] = c.time.Unix()
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.priority != nil {
|
||||||
|
body["priority"] = *c.priority
|
||||||
|
}
|
||||||
|
|
||||||
|
body["msg_id"] = mustHexUUID()
|
||||||
|
|
||||||
|
rawbody, err := json.Marshal(body)
|
||||||
|
if err != nil {
|
||||||
|
return MessageResponse{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequestWithContext(ctx, "POST", "https://simplecloudnotifier.de/", bytes.NewBuffer(rawbody))
|
||||||
|
if err != nil {
|
||||||
|
return MessageResponse{}, err
|
||||||
|
}
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return MessageResponse{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
|
||||||
|
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
|
||||||
|
|
||||||
|
raw, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return MessageResponse{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var mr MessageResponse
|
||||||
|
err = json.Unmarshal(raw, &mr)
|
||||||
|
if err != nil {
|
||||||
|
return MessageResponse{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return mr, nil
|
||||||
|
} else {
|
||||||
|
errMessage := resp.Status
|
||||||
|
|
||||||
|
if raw, err := io.ReadAll(resp.Body); err == nil {
|
||||||
|
var mr MessageErrResponse
|
||||||
|
if err = json.Unmarshal(raw, &mr); err == nil {
|
||||||
|
errMessage = mr.Message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode == 400 {
|
||||||
|
return MessageResponse{}, NewError(ErrBadRequest, errMessage).Build()
|
||||||
|
}
|
||||||
|
if resp.StatusCode == 401 {
|
||||||
|
return MessageResponse{}, NewError(ErrAuthFailed, errMessage).Build()
|
||||||
|
}
|
||||||
|
if resp.StatusCode == 403 {
|
||||||
|
return MessageResponse{}, NewError(ErrQuota, errMessage).Build()
|
||||||
|
}
|
||||||
|
if resp.StatusCode == 500 {
|
||||||
|
return MessageResponse{}, NewError(ErrInternalServerErr, errMessage).Build()
|
||||||
|
}
|
||||||
|
|
||||||
|
return MessageResponse{}, NewError(ErrOther, errMessage).Build()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
24
send_test.go
Normal file
24
send_test.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package scn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSendSCN(t *testing.T) {
|
||||||
|
t.Skip()
|
||||||
|
return
|
||||||
|
|
||||||
|
mr, err := New("TODO", "TODO").
|
||||||
|
Message("Hello Test").
|
||||||
|
Content("This is a test / goext").
|
||||||
|
Send(context.Background())
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%+v\n", mr)
|
||||||
|
|
||||||
|
}
|
49
uuid.go
Normal file
49
uuid.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package scn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"encoding/hex"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func mustHexUUID() string {
|
||||||
|
v, err := NewHexUUID()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewHexUUID() (string, error) {
|
||||||
|
uuid, err := NewUUID()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Result: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||||
|
|
||||||
|
var dst = make([]byte, 36)
|
||||||
|
|
||||||
|
hex.Encode(dst, uuid[:4])
|
||||||
|
dst[8] = '-'
|
||||||
|
hex.Encode(dst[9:13], uuid[4:6])
|
||||||
|
dst[13] = '-'
|
||||||
|
hex.Encode(dst[14:18], uuid[6:8])
|
||||||
|
dst[18] = '-'
|
||||||
|
hex.Encode(dst[19:23], uuid[8:10])
|
||||||
|
dst[23] = '-'
|
||||||
|
hex.Encode(dst[24:], uuid[10:])
|
||||||
|
|
||||||
|
return string(dst), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUUID() ([16]byte, error) {
|
||||||
|
var uuid [16]byte
|
||||||
|
_, err := io.ReadFull(rand.Reader, uuid[:])
|
||||||
|
if err != nil {
|
||||||
|
return [16]byte{}, err
|
||||||
|
}
|
||||||
|
uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4
|
||||||
|
uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10
|
||||||
|
return uuid, nil
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user