all repos — honk @ d68f92598e63effde3bfcc0af7de626104dc7e6b

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	"fmt"
 20	"html/template"
 21	"log"
 22	"os"
 23	"time"
 24)
 25
 26type WhatAbout struct {
 27	ID        int64
 28	Name      string
 29	Display   string
 30	About     string
 31	Key       string
 32	URL       string
 33	SkinnyCSS bool
 34}
 35
 36type Honk struct {
 37	ID       int64
 38	UserID   int64
 39	Username string
 40	What     string
 41	Honker   string
 42	Handle   string
 43	Oonker   string
 44	Oondle   string
 45	XID      string
 46	RID      string
 47	Date     time.Time
 48	URL      string
 49	Noise    string
 50	Precis   string
 51	Format   string
 52	Convoy   string
 53	Audience []string
 54	Public   bool
 55	Whofore  int64
 56	Replies  []*Honk
 57	Flags    int64
 58	HTPrecis template.HTML
 59	HTML     template.HTML
 60	Style    string
 61	Open     string
 62	Donks    []*Donk
 63	Onts     []string
 64	Place    *Place
 65}
 66
 67const (
 68	flagIsAcked  = 1
 69	flagIsBonked = 2
 70)
 71
 72func (honk *Honk) IsAcked() bool {
 73	return honk.Flags&flagIsAcked != 0
 74}
 75
 76func (honk *Honk) IsBonked() bool {
 77	return honk.Flags&flagIsBonked != 0
 78}
 79
 80type Donk struct {
 81	FileID  int64
 82	XID     string
 83	Name    string
 84	Desc    string
 85	URL     string
 86	Media   string
 87	Local   bool
 88	Content []byte
 89}
 90
 91type Place struct {
 92	Name      string
 93	Latitude  float64
 94	Longitude float64
 95	Url       string
 96}
 97
 98type Honker struct {
 99	ID     int64
100	UserID int64
101	Name   string
102	XID    string
103	Handle string
104	Flavor string
105	Combos []string
106}
107
108type Zonker struct {
109	ID        int64
110	Name      string
111	Wherefore string
112}
113
114var serverName string
115var iconName = "icon.png"
116var serverMsg = "Things happen."
117
118func ElaborateUnitTests() {
119}
120
121func main() {
122	cmd := "run"
123	if len(os.Args) > 1 {
124		cmd = os.Args[1]
125	}
126	switch cmd {
127	case "init":
128		initdb()
129	case "upgrade":
130		upgradedb()
131	}
132	db := opendatabase()
133	dbversion := 0
134	getconfig("dbversion", &dbversion)
135	if dbversion != myVersion {
136		log.Fatal("incorrect database version. run upgrade.")
137	}
138	getconfig("servermsg", &serverMsg)
139	getconfig("servername", &serverName)
140	getconfig("usersep", &userSep)
141	getconfig("honksep", &honkSep)
142	prepareStatements(db)
143	switch cmd {
144	case "adduser":
145		adduser()
146	case "cleanup":
147		arg := "30"
148		if len(os.Args) > 2 {
149			arg = os.Args[2]
150		}
151		cleanupdb(arg)
152	case "ping":
153		if len(os.Args) < 4 {
154			fmt.Printf("usage: honk ping from to\n")
155			return
156		}
157		name := os.Args[2]
158		targ := os.Args[3]
159		user, err := butwhatabout(name)
160		if err != nil {
161			log.Printf("unknown user")
162			return
163		}
164		ping(user, targ)
165	case "peep":
166		peeppeep()
167	case "run":
168		serve()
169	case "test":
170		ElaborateUnitTests()
171	default:
172		log.Fatal("unknown command")
173	}
174}