all repos — honk @ 4176f74dbeac47c69224d380629d574f132f777b

my fork of honk

honk.go (view raw)

  1//
  2// Copyright (c) 2019 Ted Unangst <tedu@tedunangst.com>
  3//
  4// Permission to use, copy, modify, and distribute this software for any
  5// purpose with or without fee is hereby granted, provided that the above
  6// copyright notice and this permission notice appear in all copies.
  7//
  8// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 10// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 11// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 12// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 13// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 14// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 15
 16package main
 17
 18import (
 19	"html/template"
 20	"strconv"
 21	"strings"
 22	"time"
 23
 24	"humungus.tedunangst.com/r/webs/httpsig"
 25)
 26
 27type WhatAbout struct {
 28	ID      int64
 29	Name    string
 30	Display string
 31	About   string
 32	HTAbout template.HTML
 33	Onts    []string
 34	Key     string
 35	URL     string
 36	Options UserOptions
 37	SecKey  httpsig.PrivateKey
 38}
 39
 40type UserOptions struct {
 41	SkinnyCSS    bool   `json:",omitempty"`
 42	OmitImages   bool   `json:",omitempty"`
 43	MentionAll   bool   `json:",omitempty"`
 44	InlineQuotes bool   `json:",omitempty"`
 45	Avatar       string `json:",omitempty"`
 46	Banner       string `json:",omitempty"`
 47	MapLink      string `json:",omitempty"`
 48	Reaction     string `json:",omitempty"`
 49	MeCount      int64
 50	ChatCount    int64
 51}
 52
 53type KeyInfo struct {
 54	keyname string
 55	seckey  httpsig.PrivateKey
 56}
 57
 58const serverUID int64 = -2
 59const readyLuserOne int64 = 1
 60
 61type Honk struct {
 62	ID       int64
 63	UserID   int64
 64	Username string
 65	What     string
 66	Honker   string
 67	Handle   string
 68	Handles  string
 69	Oonker   string
 70	Oondle   string
 71	XID      string
 72	RID      string
 73	Date     time.Time
 74	URL      string
 75	Noise    string
 76	Precis   string
 77	Format   string
 78	Convoy   string
 79	Audience []string
 80	Public   bool
 81	Whofore  int64
 82	Replies  []*Honk
 83	Flags    int64
 84	HTPrecis template.HTML
 85	HTML     template.HTML
 86	Style    string
 87	Open     string
 88	Donks    []*Donk
 89	Onts     []string
 90	Place    *Place
 91	Time     *Time
 92	Mentions []Mention
 93	Badonks  []Badonk
 94}
 95
 96type Badonk struct {
 97	Who  string
 98	What string
 99}
100
101type Chonk struct {
102	ID     int64
103	UserID int64
104	XID    string
105	Who    string
106	Target string
107	Date   time.Time
108	Noise  string
109	Format string
110	Donks  []*Donk
111	Handle string
112	HTML   template.HTML
113}
114
115type Chatter struct {
116	Target string
117	Chonks []*Chonk
118}
119
120type Mention struct {
121	Who   string
122	Where string
123}
124
125func (mention *Mention) IsPresent(noise string) bool {
126	nick := strings.TrimLeft(mention.Who, "@")
127	idx := strings.IndexByte(nick, '@')
128	if idx != -1 {
129		nick = nick[:idx]
130	}
131	return strings.Contains(noise, ">@"+nick) || strings.Contains(noise, "@<span>"+nick)
132}
133
134func OntIsPresent(ont, noise string) bool {
135	ont = strings.ToLower(ont[1:])
136	idx := strings.IndexByte(noise, '#')
137	for idx >= 0 {
138		if strings.HasPrefix(noise[idx:], "#<span>") {
139			idx += 6
140		}
141		idx += 1
142		if idx+len(ont) >= len(noise) {
143			return false
144		}
145		test := noise[idx : idx+len(ont)]
146		test = strings.ToLower(test)
147		if test == ont {
148			return true
149		}
150		newidx := strings.IndexByte(noise[idx:], '#')
151		if newidx == -1 {
152			return false
153		}
154		idx += newidx
155	}
156	return false
157}
158
159type OldRevision struct {
160	Precis string
161	Noise  string
162}
163
164const (
165	flagIsAcked    = 1
166	flagIsBonked   = 2
167	flagIsSaved    = 4
168	flagIsUntagged = 8
169	flagIsReacted  = 16
170)
171
172func (honk *Honk) IsAcked() bool {
173	return honk.Flags&flagIsAcked != 0
174}
175
176func (honk *Honk) IsBonked() bool {
177	return honk.Flags&flagIsBonked != 0
178}
179
180func (honk *Honk) IsSaved() bool {
181	return honk.Flags&flagIsSaved != 0
182}
183
184func (honk *Honk) IsUntagged() bool {
185	return honk.Flags&flagIsUntagged != 0
186}
187
188func (honk *Honk) IsReacted() bool {
189	return honk.Flags&flagIsReacted != 0
190}
191
192type Donk struct {
193	FileID   int64
194	XID      string
195	Name     string
196	Desc     string
197	URL      string
198	Media    string
199	Local    bool
200	External bool
201}
202
203type Place struct {
204	Name      string
205	Latitude  float64
206	Longitude float64
207	Url       string
208}
209
210type Duration int64
211
212func (d Duration) String() string {
213	s := time.Duration(d).String()
214	if strings.HasSuffix(s, "m0s") {
215		s = s[:len(s)-2]
216	}
217	if strings.HasSuffix(s, "h0m") {
218		s = s[:len(s)-2]
219	}
220	return s
221}
222
223func parseDuration(s string) time.Duration {
224	didx := strings.IndexByte(s, 'd')
225	if didx != -1 {
226		days, _ := strconv.ParseInt(s[:didx], 10, 0)
227		dur, _ := time.ParseDuration(s[didx:])
228		return dur + 24*time.Hour*time.Duration(days)
229	}
230	dur, _ := time.ParseDuration(s)
231	return dur
232}
233
234type Time struct {
235	StartTime time.Time
236	EndTime   time.Time
237	Duration  Duration
238}
239
240type Honker struct {
241	ID     int64
242	UserID int64
243	Name   string
244	XID    string
245	Handle string
246	Flavor string
247	Combos []string
248	Meta   HonkerMeta
249}
250
251type HonkerMeta struct {
252	Notes string
253}
254
255type SomeThing struct {
256	What  int
257	XID   string
258	Owner string
259	Name  string
260}
261
262const (
263	SomeNothing int = iota
264	SomeActor
265	SomeCollection
266)