81 lines
1.6 KiB
Go
81 lines
1.6 KiB
Go
|
|
package meowlib
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"compress/gzip"
|
||
|
|
"io"
|
||
|
|
"os"
|
||
|
|
|
||
|
|
"github.com/makiuchi-d/gozxing"
|
||
|
|
"github.com/makiuchi-d/gozxing/qrcode"
|
||
|
|
"google.golang.org/protobuf/proto"
|
||
|
|
|
||
|
|
"image/png"
|
||
|
|
)
|
||
|
|
|
||
|
|
func (p *InvitationInitPayload) Serialize() ([]byte, error) {
|
||
|
|
return proto.Marshal(p)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *InvitationInitPayload) Compress() ([]byte, error) {
|
||
|
|
out, err := p.Serialize()
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
var b bytes.Buffer
|
||
|
|
gz, err := gzip.NewWriterLevel(&b, gzip.BestCompression)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
if _, err := gz.Write(out); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
if err := gz.Close(); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return b.Bytes(), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewInvitationInitPayloadFromCompressed(compressed []byte) (*InvitationInitPayload, error) {
|
||
|
|
p := &InvitationInitPayload{}
|
||
|
|
reader := bytes.NewReader(compressed)
|
||
|
|
gzreader, err := gzip.NewReader(reader)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
output, err := io.ReadAll(gzreader)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
if err := proto.Unmarshal(output, p); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
return p, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *InvitationInitPayload) WriteCompressed(filename string) error {
|
||
|
|
out, err := p.Compress()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
return os.WriteFile(filename, out, 0600)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (p *InvitationInitPayload) WriteQr(filename string) error {
|
||
|
|
data, err := p.Compress()
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
qwriter := qrcode.NewQRCodeWriter()
|
||
|
|
code, err := qwriter.Encode(string(data), gozxing.BarcodeFormat_QR_CODE, 512, 512, nil)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
file, err := os.Create(filename)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
defer file.Close()
|
||
|
|
return png.Encode(file, code)
|
||
|
|
}
|