log errors properly in ForumsOrderSubmit

fix tiff extensions in canResize check
reduce boilerplate
This commit is contained in:
Azareal 2021-01-06 16:41:08 +10:00
parent 1c5967ad7e
commit 74193223ee
12 changed files with 131 additions and 129 deletions

View File

@ -238,7 +238,7 @@ func (s *DefaultConversationStore) GetUserExtra(uid, offset int) (cos []*Convers
users[i] = user users[i] = user
i++ i++
} }
return []*ConversationExtra{&ConversationExtra{raw[0], users}}, nil return []*ConversationExtra{{raw[0], users}}, nil
} }
//log.Println("1") //log.Println("1")

View File

@ -28,7 +28,7 @@ type DefaultPerfCounter struct {
func NewDefaultPerfCounter(acc *qgen.Accumulator) (*DefaultPerfCounter, error) { func NewDefaultPerfCounter(acc *qgen.Accumulator) (*DefaultPerfCounter, error) {
co := &DefaultPerfCounter{ co := &DefaultPerfCounter{
buckets: []*PerfCounterBucket{ buckets: []*PerfCounterBucket{
&PerfCounterBucket{ {
low: &MutexCounter64Bucket{counter: math.MaxInt64}, low: &MutexCounter64Bucket{counter: math.MaxInt64},
high: &MutexCounter64Bucket{counter: 0}, high: &MutexCounter64Bucket{counter: 0},
avg: &MutexCounter64Bucket{counter: 0}, avg: &MutexCounter64Bucket{counter: 0},

View File

@ -163,15 +163,15 @@ func PreparseMessage(msg string) string {
// TODO: We can maybe reduce the size of this by using an offset? // TODO: We can maybe reduce the size of this by using an offset?
// TODO: Move some of these closures out of this function to make things a little more efficient // TODO: Move some of these closures out of this function to make things a little more efficient
allowedTags := [][]string{ allowedTags := [][]string{
'e': []string{"m"}, 'e': {"m"},
's': []string{"", "trong", "poiler", "pan"}, 's': {"", "trong", "poiler", "pan"},
'd': []string{"el"}, 'd': {"el"},
'u': []string{""}, 'u': {""},
'b': []string{"", "lockquote"}, 'b': {"", "lockquote"},
'i': []string{""}, 'i': {""},
'h': []string{"1", "2", "3"}, 'h': {"1", "2", "3"},
//'p': []string{""}, //'p': {""},
'g': []string{""}, // Quick and dirty fix for Grammarly 'g': {""}, // Quick and dirty fix for Grammarly
} }
buildLitMatch := func(tag string) func(*TagToAction, bool, int, []rune) (int, string) { buildLitMatch := func(tag string) func(*TagToAction, bool, int, []rune) (int, string) {
return func(action *TagToAction, open bool, _ int, _ []rune) (int, string) { return func(action *TagToAction, open bool, _ int, _ []rune) (int, string) {
@ -187,13 +187,13 @@ func PreparseMessage(msg string) string {
} }
} }
tagToAction := [][]*TagToAction{ tagToAction := [][]*TagToAction{
'e': []*TagToAction{&TagToAction{"m", buildLitMatch("em"), 0, false}}, 'e': {{"m", buildLitMatch("em"), 0, false}},
's': []*TagToAction{ 's': {
&TagToAction{"", buildLitMatch("del"), 0, false}, {"", buildLitMatch("del"), 0, false},
&TagToAction{"trong", buildLitMatch("strong"), 0, false}, {"trong", buildLitMatch("strong"), 0, false},
&TagToAction{"poiler", buildLitMatch("spoiler"), 0, false}, {"poiler", buildLitMatch("spoiler"), 0, false},
// Hides the span tags Trumbowyg loves blasting out randomly // Hides the span tags Trumbowyg loves blasting out randomly
&TagToAction{"pan", func(act *TagToAction, open bool, i int, runes []rune) (int, string) { {"pan", func(act *TagToAction, open bool, i int, runes []rune) (int, string) {
if open { if open {
act.Depth++ act.Depth++
//fmt.Println("skipping attributes") //fmt.Println("skipping attributes")
@ -212,21 +212,21 @@ func PreparseMessage(msg string) string {
return -1, " " return -1, " "
}, 0, true}, }, 0, true},
}, },
'd': []*TagToAction{&TagToAction{"el", buildLitMatch("del"), 0, false}}, 'd': {{"el", buildLitMatch("del"), 0, false}},
'u': []*TagToAction{&TagToAction{"", buildLitMatch("u"), 0, false}}, 'u': {{"", buildLitMatch("u"), 0, false}},
'b': []*TagToAction{ 'b': {
&TagToAction{"", buildLitMatch("strong"), 0, false}, {"", buildLitMatch("strong"), 0, false},
&TagToAction{"lockquote", buildLitMatch("blockquote"), 0, false}, {"lockquote", buildLitMatch("blockquote"), 0, false},
}, },
'i': []*TagToAction{&TagToAction{"", buildLitMatch("em"), 0, false}}, 'i': {{"", buildLitMatch("em"), 0, false}},
'h': []*TagToAction{ 'h': {
&TagToAction{"1", buildLitMatch("h2"), 0, false}, {"1", buildLitMatch("h2"), 0, false},
&TagToAction{"2", buildLitMatch("h3"), 0, false}, {"2", buildLitMatch("h3"), 0, false},
&TagToAction{"3", buildLitMatch("h4"), 0, false}, {"3", buildLitMatch("h4"), 0, false},
}, },
//'p': []*TagToAction{&TagToAction{"", buildLitMatch2("\n\n", ""), 0, false}}, //'p': {{"", buildLitMatch2("\n\n", ""), 0, false}},
'g': []*TagToAction{ 'g': {
&TagToAction{"", func(act *TagToAction, open bool, i int, runes []rune) (int, string) { {"", func(act *TagToAction, open bool, i int, runes []rune) (int, string) {
if open { if open {
act.Depth++ act.Depth++
//fmt.Println("skipping attributes") //fmt.Println("skipping attributes")
@ -482,9 +482,11 @@ func ParseMessage(msg string, sectionID int, sectionType string, settings *Parse
msg, _ = ParseMessage2(msg, sectionID, sectionType, settings, user) msg, _ = ParseMessage2(msg, sectionID, sectionType, settings, user)
return msg return msg
} }
var litRepPrefix = []byte{':',';'}
//var litRep = [][]byte{':':[]byte{')','(','D','O','o','P','p'},';':[]byte{')'}} var litRepPrefix = []byte{':', ';'}
var litRep = [][]string{':':[]string{')':"😀",'(':"😞",'D':"😃",'O':"😲",'o':"😲",'P':"😛",'p':"😛"},';':[]string{')':"😉"}}
//var litRep = [][]byte{':':{')','(','D','O','o','P','p'},';':{')'}}
var litRep = [][]string{':': {')': "😀", '(': "😞", 'D': "😃", 'O': "😲", 'o': "😲", 'P': "😛", 'p': "😛"}, ';': {')': "😉"}}
// TODO: Write a test for this // TODO: Write a test for this
// TODO: We need a lot more hooks here. E.g. To add custom media types and handlers. // TODO: We need a lot more hooks here. E.g. To add custom media types and handlers.

View File

@ -79,7 +79,7 @@ type DefaultRateLimiter struct {
func NewDefaultRateLimiter() *DefaultRateLimiter { func NewDefaultRateLimiter() *DefaultRateLimiter {
return &DefaultRateLimiter{map[string]*RateLimit{ return &DefaultRateLimiter{map[string]*RateLimit{
"register": NewRateLimit([]RateFence{RateFence{int(time.Hour / 2), 1}}), "register": NewRateLimit([]RateFence{{int(time.Hour / 2), 1}}),
}} }}
} }

View File

@ -114,10 +114,10 @@ func tmplInitHeaders(u, u2, u3 *User) (*Header, *Header, *Header) {
Theme: Themes[DefaultThemeBox.Load().(string)], Theme: Themes[DefaultThemeBox.Load().(string)],
CurrentUser: u, CurrentUser: u,
NoticeList: []string{"test"}, NoticeList: []string{"test"},
Stylesheets: []HScript{HScript{"panel.css", ""}}, Stylesheets: []HScript{{"panel.css", ""}},
Scripts: []HScript{HScript{"whatever.js", ""}}, Scripts: []HScript{{"whatever.js", ""}},
PreScriptsAsync: []HScript{HScript{"whatever.js", ""}}, PreScriptsAsync: []HScript{{"whatever.js", ""}},
ScriptsAsync: []HScript{HScript{"whatever.js", ""}}, ScriptsAsync: []HScript{{"whatever.js", ""}},
Widgets: PageWidgets{ Widgets: PageWidgets{
LeftSidebar: template.HTML("lalala"), LeftSidebar: template.HTML("lalala"),
}, },
@ -239,11 +239,11 @@ func compileCommons(c *tmpl.CTemplateSet, head, head2 *Header, forumList []Forum
o.Add("forums", "c.ForumsPage", ForumsPage{htitle("Forum List"), forumList}) o.Add("forums", "c.ForumsPage", ForumsPage{htitle("Forum List"), forumList})
poll := Poll{ID: 1, Type: 0, Options: map[int]string{0: "Nothing", 1: "Something"}, Results: map[int]int{0: 5, 1: 2}, QuickOptions: []PollOption{ poll := Poll{ID: 1, Type: 0, Options: map[int]string{0: "Nothing", 1: "Something"}, Results: map[int]int{0: 5, 1: 2}, QuickOptions: []PollOption{
PollOption{0, "Nothing"}, {0, "Nothing"},
PollOption{1, "Something"}, {1, "Something"},
}, VoteCount: 7} }, VoteCount: 7}
avatar, microAvatar := BuildAvatar(62, "") avatar, microAvatar := BuildAvatar(62, "")
miniAttach := []*MiniAttachment{&MiniAttachment{Path: "/"}} miniAttach := []*MiniAttachment{{Path: "/"}}
tu := TopicUser{1, "blah", "Blah", "Hey there!", 0, false, false, now, now, 1, 1, 0, "", "127.0.0.1", 1, 0, 1, 0, "classname", poll.ID, "weird-data", BuildProfileURL("fake-user", 62), "Fake User", Config.DefaultGroup, avatar, microAvatar, 0, "", "", "", 58, false, miniAttach, nil, false} tu := TopicUser{1, "blah", "Blah", "Hey there!", 0, false, false, now, now, 1, 1, 0, "", "127.0.0.1", 1, 0, 1, 0, "classname", poll.ID, "weird-data", BuildProfileURL("fake-user", 62), "Fake User", Config.DefaultGroup, avatar, microAvatar, 0, "", "", "", 58, false, miniAttach, nil, false}
var replyList []*ReplyUser var replyList []*ReplyUser
@ -272,7 +272,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
PollOption{1, "Something"}, PollOption{1, "Something"},
}, VoteCount: 7}*/ }, VoteCount: 7}*/
//avatar, microAvatar := BuildAvatar(62, "") //avatar, microAvatar := BuildAvatar(62, "")
miniAttach := []*MiniAttachment{&MiniAttachment{Path: "/"}} miniAttach := []*MiniAttachment{{Path: "/"}}
var replyList []*ReplyUser var replyList []*ReplyUser
//topic := TopicUser{1, "blah", "Blah", "Hey there!", 0, false, false, now, now, 1, 1, 0, "", "127.0.0.1", 1, 0, 1, 0, "classname", poll.ID, "weird-data", BuildProfileURL("fake-user", 62), "Fake User", Config.DefaultGroup, avatar, microAvatar, 0, "", "", "", "", "", 58, false, miniAttach, nil} //topic := TopicUser{1, "blah", "Blah", "Hey there!", 0, false, false, now, now, 1, 1, 0, "", "127.0.0.1", 1, 0, 1, 0, "classname", poll.ID, "weird-data", BuildProfileURL("fake-user", 62), "Fake User", Config.DefaultGroup, avatar, microAvatar, 0, "", "", "", "", "", 58, false, miniAttach, nil}
// TODO: Do we want the UID on this to be 0? // TODO: Do we want the UID on this to be 0?
@ -351,7 +351,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
} }
t.AddStd("login", "c.Page", Page{htitle("Login Page"), tList, nil}) t.AddStd("login", "c.Page", Page{htitle("Login Page"), tList, nil})
t.AddStd("register", "c.RegisterPage", RegisterPage{htitle("Registration Page"), false, "", []RegisterVerify{RegisterVerify{true, &RegisterVerifyImageGrid{"What?", []RegisterVerifyImageGridImage{RegisterVerifyImageGridImage{"something.png"}}}}}}) t.AddStd("register", "c.RegisterPage", RegisterPage{htitle("Registration Page"), false, "", []RegisterVerify{{true, &RegisterVerifyImageGrid{"What?", []RegisterVerifyImageGridImage{{"something.png"}}}}}})
t.AddStd("error", "c.ErrorPage", ErrorPage{htitle("Error"), "A problem has occurred in the system."}) t.AddStd("error", "c.ErrorPage", ErrorPage{htitle("Error"), "A problem has occurred in the system."})
ipSearchPage := IPSearchPage{htitle("IP Search"), map[int]*User{1: user2}, "::1"} ipSearchPage := IPSearchPage{htitle("IP Search"), map[int]*User{1: user2}, "::1"}
@ -363,11 +363,11 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
parti := []*User{user} parti := []*User{user}
convo := &Conversation{1, BuildConvoURL(1), user.ID, time.Now(), 0, time.Now()} convo := &Conversation{1, BuildConvoURL(1), user.ID, time.Now(), 0, time.Now()}
convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1, 1, "hey", "", user.ID}, user, "", 4, true}} convoItems := []ConvoViewRow{{&ConversationPost{1, 1, "hey", "", user.ID}, user, "", 4, true}}
convoPage := ConvoViewPage{header, convo, convoItems, parti, true, Paginator{[]int{1}, 1, 1}} convoPage := ConvoViewPage{header, convo, convoItems, parti, true, Paginator{[]int{1}, 1, 1}}
t.AddStd("convo", "c.ConvoViewPage", convoPage) t.AddStd("convo", "c.ConvoViewPage", convoPage)
convos := []*ConversationExtra{&ConversationExtra{&Conversation{}, []*User{user}}} convos := []*ConversationExtra{{&Conversation{}, []*User{user}}}
var cRows []ConvoListRow var cRows []ConvoListRow
for _, convo := range convos { for _, convo := range convos {
cRows = append(cRows, ConvoListRow{convo, convo.Users, false}) cRows = append(cRows, ConvoListRow{convo, convo.Users, false})
@ -377,7 +377,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
basePage := &BasePanelPage{header, PanelStats{}, "dashboard", ReportForumID, true} basePage := &BasePanelPage{header, PanelStats{}, "dashboard", ReportForumID, true}
t.AddStd("panel", "c.Panel", Panel{basePage, "panel_dashboard_right", "", "panel_dashboard", inter}) t.AddStd("panel", "c.Panel", Panel{basePage, "panel_dashboard_right", "", "panel_dashboard", inter})
ges := []GridElement{GridElement{"", "", "", 1, "grid_istat", "", "", ""}} ges := []GridElement{{"", "", "", 1, "grid_istat", "", "", ""}}
t.AddStd("panel_dashboard", "c.DashGrids", DashGrids{ges, ges}) t.AddStd("panel_dashboard", "c.DashGrids", DashGrids{ges, ges})
goVersion := runtime.Version() goVersion := runtime.Version()
@ -545,11 +545,11 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri
t.AddStd("topics_topic", "c.TopicsRowMut", topicsRow) t.AddStd("topics_topic", "c.TopicsRowMut", topicsRow)
poll := Poll{ID: 1, Type: 0, Options: map[int]string{0: "Nothing", 1: "Something"}, Results: map[int]int{0: 5, 1: 2}, QuickOptions: []PollOption{ poll := Poll{ID: 1, Type: 0, Options: map[int]string{0: "Nothing", 1: "Something"}, Results: map[int]int{0: 5, 1: 2}, QuickOptions: []PollOption{
PollOption{0, "Nothing"}, {0, "Nothing"},
PollOption{1, "Something"}, {1, "Something"},
}, VoteCount: 7} }, VoteCount: 7}
avatar, microAvatar := BuildAvatar(62, "") avatar, microAvatar := BuildAvatar(62, "")
miniAttach := []*MiniAttachment{&MiniAttachment{Path: "/"}} miniAttach := []*MiniAttachment{{Path: "/"}}
tu := TopicUser{1, "blah", "Blah", "Hey there!", 62, false, false, now, now, 1, 1, 0, "", "::1", 1, 0, 1, 0, "classname", poll.ID, "weird-data", BuildProfileURL("fake-user", 62), "Fake User", Config.DefaultGroup, avatar, microAvatar, 0, "", "", "", 58, false, miniAttach, nil, false} tu := TopicUser{1, "blah", "Blah", "Hey there!", 62, false, false, now, now, 1, 1, 0, "", "::1", 1, 0, 1, 0, "classname", poll.ID, "weird-data", BuildProfileURL("fake-user", 62), "Fake User", Config.DefaultGroup, avatar, microAvatar, 0, "", "", "", 58, false, miniAttach, nil, false}
var replyList []*ReplyUser var replyList []*ReplyUser
// TODO: Do we really want the UID here to be zero? // TODO: Do we really want the UID here to be zero?
@ -577,7 +577,7 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri
parti := []*User{user} parti := []*User{user}
convo := &Conversation{1, BuildConvoURL(1), user.ID, time.Now(), 0, time.Now()} convo := &Conversation{1, BuildConvoURL(1), user.ID, time.Now(), 0, time.Now()}
convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1, 1, "hey", "", user.ID}, user, "", 4, true}} convoItems := []ConvoViewRow{{&ConversationPost{1, 1, "hey", "", user.ID}, user, "", 4, true}}
convoPage := ConvoViewPage{header, convo, convoItems, parti, true, Paginator{[]int{1}, 1, 1}} convoPage := ConvoViewPage{header, convo, convoItems, parti, true, Paginator{[]int{1}, 1, 1}}
t.AddStd("convo", "c.ConvoViewPage", convoPage) t.AddStd("convo", "c.ConvoViewPage", convoPage)

View File

@ -49,7 +49,11 @@ func ThumbTask(thumbChan chan bool) {
/*if user.RawAvatar == ".gif" { /*if user.RawAvatar == ".gif" {
return nil return nil
}*/ }*/
if u.RawAvatar != ".png" && u.RawAvatar != ".jpg" && u.RawAvatar != ".jpe" && u.RawAvatar != ".jpeg" && u.RawAvatar != ".jif" && u.RawAvatar != ".jfi" && u.RawAvatar != ".jfif" && u.RawAvatar != ".gif" && u.RawAvatar != "tiff" && u.RawAvatar != "tif" { canResize := func(ext string) bool {
// TODO: Fix tif and tiff extensions?
return ext == ".png" && ext == ".jpg" && ext == ".jpe" && ext == ".jpeg" && ext == ".jif" && ext == ".jfi" && ext == ".jfif" && ext == ".gif" && ext == ".tiff" && ext == ".tif"
}
if !canResize(u.RawAvatar) {
return nil return nil
} }

View File

@ -138,8 +138,8 @@ func (tList *DefaultTopicList) Tick() error {
return err return err
} }
canSeeHolders[name] = [2]*TopicListHolder{ canSeeHolders[name] = [2]*TopicListHolder{
&TopicListHolder{topicList, forumList, pagi}, {topicList, forumList, pagi},
&TopicListHolder{topicList2, forumList2, pagi2}, {topicList2, forumList2, pagi2},
} }
if len(canSee) > 1 { if len(canSee) > 1 {
forumCounts[len(canSee)] += 1 forumCounts[len(canSee)] += 1

View File

@ -441,7 +441,7 @@ func (h *WsHubImpl) AddConn(user *User, conn *websocket.Conn) (*WSUser, error) {
if !ok { if !ok {
wsUser = new(WSUser) wsUser = new(WSUser)
wsUser.User = userptr wsUser.User = userptr
wsUser.Sockets = []*WSUserSocket{&WSUserSocket{conn, ""}} wsUser.Sockets = []*WSUserSocket{{conn, ""}}
theMap[user.ID] = wsUser theMap[user.ID] = wsUser
mutex.Unlock() mutex.Unlock()
return wsUser, nil return wsUser, nil

View File

@ -68,10 +68,10 @@ func ccol(col string, size int, sdefault string) qgen.DBTableColumn {
func patch0(scanner *bufio.Scanner) (err error) { func patch0(scanner *bufio.Scanner) (err error) {
err = createTable("menus", "", "", err = createTable("menus", "", "",
[]tC{ []tC{
tC{"mid", "int", 0, false, true, ""}, {"mid", "int", 0, false, true, ""},
}, },
[]tK{ []tK{
tK{"mid", "primary", "", false}, {"mid", "primary", "", false},
}, },
) )
if err != nil { if err != nil {
@ -80,8 +80,8 @@ func patch0(scanner *bufio.Scanner) (err error) {
err = createTable("menu_items", "", "", err = createTable("menu_items", "", "",
[]tC{ []tC{
tC{"miid", "int", 0, false, true, ""}, {"miid", "int", 0, false, true, ""},
tC{"mid", "int", 0, false, false, ""}, {"mid", "int", 0, false, false, ""},
ccol("name", 200, ""), ccol("name", 200, ""),
ccol("htmlID", 200, "''"), ccol("htmlID", 200, "''"),
ccol("cssClass", 200, "''"), ccol("cssClass", 200, "''"),
@ -90,7 +90,7 @@ func patch0(scanner *bufio.Scanner) (err error) {
ccol("aria", 200, "''"), ccol("aria", 200, "''"),
ccol("tooltip", 200, "''"), ccol("tooltip", 200, "''"),
ccol("tmplName", 200, "''"), ccol("tmplName", 200, "''"),
tC{"order", "int", 0, false, false, "0"}, {"order", "int", 0, false, false, "0"},
bcol("guestOnly", false), bcol("guestOnly", false),
bcol("memberOnly", false), bcol("memberOnly", false),
@ -98,7 +98,7 @@ func patch0(scanner *bufio.Scanner) (err error) {
bcol("adminOnly", false), bcol("adminOnly", false),
}, },
[]tK{ []tK{
tK{"miid", "primary", "", false}, {"miid", "primary", "", false},
}, },
) )
if err != nil { if err != nil {
@ -196,16 +196,16 @@ func patch2(scanner *bufio.Scanner) error {
func patch3(scanner *bufio.Scanner) error { func patch3(scanner *bufio.Scanner) error {
return createTable("registration_logs", "", "", return createTable("registration_logs", "", "",
[]tC{ []tC{
tC{"rlid", "int", 0, false, true, ""}, {"rlid", "int", 0, false, true, ""},
ccol("username", 100, ""), ccol("username", 100, ""),
ccol("email", 100, ""), ccol("email", 100, ""),
ccol("failureReason", 100, ""), ccol("failureReason", 100, ""),
bcol("success", false), // Did this attempt succeed? bcol("success", false), // Did this attempt succeed?
ccol("ipaddress", 200, ""), ccol("ipaddress", 200, ""),
tC{"doneAt", "createdAt", 0, false, false, ""}, {"doneAt", "createdAt", 0, false, false, ""},
}, },
[]tK{ []tK{
tK{"rlid", "primary", "", false}, {"rlid", "primary", "", false},
}, },
) )
} }
@ -258,24 +258,19 @@ func patch4(scanner *bufio.Scanner) error {
return err return err
} }
err = createTable("pages", "utf8mb4", "utf8mb4_general_ci", return createTable("pages", "utf8mb4", "utf8mb4_general_ci",
[]tC{ []tC{
tC{"pid", "int", 0, false, true, ""}, {"pid", "int", 0, false, true, ""},
ccol("name", 200, ""), ccol("name", 200, ""),
ccol("title", 200, ""), ccol("title", 200, ""),
tC{"body", "text", 0, false, false, ""}, {"body", "text", 0, false, false, ""},
tC{"allowedGroups", "text", 0, false, false, ""}, {"allowedGroups", "text", 0, false, false, ""},
tC{"menuID", "int", 0, false, false, "-1"}, {"menuID", "int", 0, false, false, "-1"},
}, },
[]tK{ []tK{
tK{"pid", "primary", "", false}, {"pid", "primary", "", false},
}, },
) )
if err != nil {
return err
}
return nil
} }
func patch5(scanner *bufio.Scanner) error { func patch5(scanner *bufio.Scanner) error {
@ -298,7 +293,7 @@ func patch5(scanner *bufio.Scanner) error {
return createTable("users_2fa_keys", "utf8mb4", "utf8mb4_general_ci", return createTable("users_2fa_keys", "utf8mb4", "utf8mb4_general_ci",
[]tC{ []tC{
tC{"uid", "int", 0, false, false, ""}, {"uid", "int", 0, false, false, ""},
ccol("secret", 100, ""), ccol("secret", 100, ""),
ccol("scratch1", 50, ""), ccol("scratch1", 50, ""),
ccol("scratch2", 50, ""), ccol("scratch2", 50, ""),
@ -308,10 +303,10 @@ func patch5(scanner *bufio.Scanner) error {
ccol("scratch6", 50, ""), ccol("scratch6", 50, ""),
ccol("scratch7", 50, ""), ccol("scratch7", 50, ""),
ccol("scratch8", 50, ""), ccol("scratch8", 50, ""),
tC{"createdAt", "createdAt", 0, false, false, ""}, {"createdAt", "createdAt", 0, false, false, ""},
}, },
[]tK{ []tK{
tK{"uid", "primary", "", false}, {"uid", "primary", "", false},
}, },
) )
} }
@ -323,10 +318,10 @@ func patch6(scanner *bufio.Scanner) error {
func patch7(scanner *bufio.Scanner) error { func patch7(scanner *bufio.Scanner) error {
return createTable("users_avatar_queue", "", "", return createTable("users_avatar_queue", "", "",
[]tC{ []tC{
tC{"uid", "int", 0, false, false, ""}, // TODO: Make this a foreign key {"uid", "int", 0, false, false, ""}, // TODO: Make this a foreign key
}, },
[]tK{ []tK{
tK{"uid", "primary", "", false}, {"uid", "primary", "", false},
}, },
) )
} }
@ -382,7 +377,7 @@ func patch8(scanner *bufio.Scanner) error {
return createTable("updates", "", "", return createTable("updates", "", "",
[]tC{ []tC{
tC{"dbVersion", "int", 0, false, false, "0"}, {"dbVersion", "int", 0, false, false, "0"},
}, nil, }, nil,
) )
} }
@ -396,14 +391,14 @@ func patch9(scanner *bufio.Scanner) error {
return createTable("login_logs", "", "", return createTable("login_logs", "", "",
[]tC{ []tC{
tC{"lid", "int", 0, false, true, ""}, {"lid", "int", 0, false, true, ""},
tC{"uid", "int", 0, false, false, ""}, {"uid", "int", 0, false, false, ""},
bcol("success", false), // Did this attempt succeed? bcol("success", false), // Did this attempt succeed?
ccol("ipaddress", 200, ""), ccol("ipaddress", 200, ""),
tC{"doneAt", "createdAt", 0, false, false, ""}, {"doneAt", "createdAt", 0, false, false, ""},
}, },
[]tK{ []tK{
tK{"lid", "primary", "", false}, {"lid", "primary", "", false},
}, },
) )
} }
@ -536,10 +531,10 @@ func patch16(scanner *bufio.Scanner) error {
return createTable("password_resets", "", "", return createTable("password_resets", "", "",
[]tC{ []tC{
ccol("email", 200, ""), ccol("email", 200, ""),
tC{"uid", "int", 0, false, false, ""}, // TODO: Make this a foreign key {"uid", "int", 0, false, false, ""}, // TODO: Make this a foreign key
ccol("validated", 200, ""), // Token given once the one-use token is consumed, used to prevent multiple people consuming the same one-use token ccol("validated", 200, ""), // Token given once the one-use token is consumed, used to prevent multiple people consuming the same one-use token
ccol("token", 200, ""), ccol("token", 200, ""),
tC{"createdAt", "createdAt", 0, false, false, ""}, {"createdAt", "createdAt", 0, false, false, ""},
}, nil, }, nil,
) )
} }
@ -585,8 +580,8 @@ func patch18(scanner *bufio.Scanner) error {
func patch19(scanner *bufio.Scanner) error { func patch19(scanner *bufio.Scanner) error {
return createTable("memchunks", "", "", return createTable("memchunks", "", "",
[]tC{ []tC{
tC{"count", "int", 0, false, false, "0"}, {"count", "int", 0, false, false, "0"},
tC{"createdAt", "datetime", 0, false, false, ""}, {"createdAt", "datetime", 0, false, false, ""},
}, nil, }, nil,
) )
} }
@ -642,14 +637,14 @@ func patch22(scanner *bufio.Scanner) error {
func patch23(scanner *bufio.Scanner) error { func patch23(scanner *bufio.Scanner) error {
err := createTable("conversations", "", "", err := createTable("conversations", "", "",
[]tC{ []tC{
tC{"cid", "int", 0, false, true, ""}, {"cid", "int", 0, false, true, ""},
tC{"createdBy", "int", 0, false, false, ""}, // TODO: Make this a foreign key {"createdBy", "int", 0, false, false, ""}, // TODO: Make this a foreign key
tC{"createdAt", "createdAt", 0, false, false, ""}, {"createdAt", "createdAt", 0, false, false, ""},
tC{"lastReplyAt", "datetime", 0, false, false, ""}, {"lastReplyAt", "datetime", 0, false, false, ""},
tC{"lastReplyBy", "int", 0, false, false, ""}, {"lastReplyBy", "int", 0, false, false, ""},
}, },
[]tK{ []tK{
tK{"cid", "primary", "", false}, {"cid", "primary", "", false},
}, },
) )
if err != nil { if err != nil {
@ -658,14 +653,14 @@ func patch23(scanner *bufio.Scanner) error {
err = createTable("conversations_posts", "", "", err = createTable("conversations_posts", "", "",
[]tC{ []tC{
tC{"pid", "int", 0, false, true, ""}, {"pid", "int", 0, false, true, ""},
tC{"cid", "int", 0, false, false, ""}, {"cid", "int", 0, false, false, ""},
tC{"createdBy", "int", 0, false, false, ""}, {"createdBy", "int", 0, false, false, ""},
ccol("body", 50, ""), ccol("body", 50, ""),
ccol("post", 50, "''"), ccol("post", 50, "''"),
}, },
[]tK{ []tK{
tK{"pid", "primary", "", false}, {"pid", "primary", "", false},
}, },
) )
if err != nil { if err != nil {
@ -674,8 +669,8 @@ func patch23(scanner *bufio.Scanner) error {
return createTable("conversations_participants", "", "", return createTable("conversations_participants", "", "",
[]tC{ []tC{
tC{"uid", "int", 0, false, false, ""}, {"uid", "int", 0, false, false, ""},
tC{"cid", "int", 0, false, false, ""}, {"cid", "int", 0, false, false, ""},
}, nil, }, nil,
) )
} }
@ -683,17 +678,17 @@ func patch23(scanner *bufio.Scanner) error {
func patch24(scanner *bufio.Scanner) error { func patch24(scanner *bufio.Scanner) error {
return createTable("users_groups_promotions", "", "", return createTable("users_groups_promotions", "", "",
[]tC{ []tC{
tC{"pid", "int", 0, false, true, ""}, {"pid", "int", 0, false, true, ""},
tC{"from_gid", "int", 0, false, false, ""}, {"from_gid", "int", 0, false, false, ""},
tC{"to_gid", "int", 0, false, false, ""}, {"to_gid", "int", 0, false, false, ""},
bcol("two_way", false), // If a user no longer meets the requirements for this promotion then they will be demoted if this flag is set bcol("two_way", false), // If a user no longer meets the requirements for this promotion then they will be demoted if this flag is set
// Requirements // Requirements
tC{"level", "int", 0, false, false, ""}, {"level", "int", 0, false, false, ""},
tC{"minTime", "int", 0, false, false, ""}, // How long someone needs to have been in their current group before being promoted {"minTime", "int", 0, false, false, ""}, // How long someone needs to have been in their current group before being promoted
}, },
[]tK{ []tK{
tK{"pid", "primary", "", false}, {"pid", "primary", "", false},
}, },
) )
} }
@ -705,8 +700,8 @@ func patch25(scanner *bufio.Scanner) error {
func patch26(scanner *bufio.Scanner) error { func patch26(scanner *bufio.Scanner) error {
return createTable("users_blocks", "", "", return createTable("users_blocks", "", "",
[]tC{ []tC{
tC{"blocker", "int", 0, false, false, ""}, {"blocker", "int", 0, false, false, ""},
tC{"blockedUser", "int", 0, false, false, ""}, {"blockedUser", "int", 0, false, false, ""},
}, nil, }, nil,
) )
} }
@ -854,10 +849,10 @@ func createTable(tbl, charset, collation string, cols []tC, keys []tK) error {
func patch32(scanner *bufio.Scanner) error { func patch32(scanner *bufio.Scanner) error {
return createTable("perfchunks", "", "", return createTable("perfchunks", "", "",
[]tC{ []tC{
tC{"low", "int", 0, false, false, "0"}, {"low", "int", 0, false, false, "0"},
tC{"high", "int", 0, false, false, "0"}, {"high", "int", 0, false, false, "0"},
tC{"avg", "int", 0, false, false, "0"}, {"avg", "int", 0, false, false, "0"},
tC{"createdAt", "datetime", 0, false, false, ""}, {"createdAt", "datetime", 0, false, false, ""},
}, nil, }, nil,
) )
} }
@ -869,12 +864,12 @@ func patch33(scanner *bufio.Scanner) error {
func patch34(scanner *bufio.Scanner) error { func patch34(scanner *bufio.Scanner) error {
/*err := createTable("tables", "", "", /*err := createTable("tables", "", "",
[]tC{ []tC{
tC{"id", "int", 0, false, true, ""}, {"id", "int", 0, false, true, ""},
ccol("name", 200, ""), ccol("name", 200, ""),
}, },
[]tK{ []tK{
tK{"id", "primary", "", false}, {"id", "primary", "", false},
tK{"name", "unique", "", false}, {"name", "unique", "", false},
}, },
) )
if err != nil { if err != nil {

View File

@ -1,8 +1,8 @@
function memStuff(window, document, Chartist) { function memStuff(window,document,Chartist) {
'use strict'; 'use strict';
Chartist.plugins = Chartist.plugins || {}; Chartist.plugins = Chartist.plugins || {};
Chartist.plugins.byteUnits = function(options) { Chartist.plugins.byteUnits = function(options) {
options = Chartist.extend({}, {}, options); options = Chartist.extend({},{},options);
return function byteUnits(chart) { return function byteUnits(chart) {
if(!chart instanceof Chartist.Line) return; if(!chart instanceof Chartist.Line) return;
@ -13,7 +13,7 @@ function memStuff(window, document, Chartist) {
if(vbits==null) return; if(vbits==null) return;
let tbits = []; let tbits = [];
for(let i = 0; i < vbits.length; i++) { for(let i=0; i<vbits.length; i++) {
tbits[i] = vbits[i].innerHTML; tbits[i] = vbits[i].innerHTML;
} }
log("tbits",tbits); log("tbits",tbits);
@ -23,12 +23,11 @@ function memStuff(window, document, Chartist) {
const matcher = vbits[0].innerHTML; const matcher = vbits[0].innerHTML;
let allMatch = true; let allMatch = true;
for(let i = 0; i < tbits.length; i++) { for(let i=0; i<tbits.length; i++) {
let val = convertByteUnit(tbits[i], places); let val = convertByteUnit(tbits[i], places);
if(val!=matcher) allMatch = false; if(val!=matcher) allMatch = false;
vbits[i].innerHTML = val; vbits[i].innerHTML = val;
} }
if(allMatch) calc(places + 1); if(allMatch) calc(places + 1);
} }
calc(0); calc(0);
@ -37,11 +36,11 @@ function memStuff(window, document, Chartist) {
}; };
} }
function perfStuff(window, document, Chartist) { function perfStuff(window,document,Chartist) {
'use strict'; 'use strict';
Chartist.plugins = Chartist.plugins || {}; Chartist.plugins = Chartist.plugins || {};
Chartist.plugins.perfUnits = function(options) { Chartist.plugins.perfUnits = function(options) {
options = Chartist.extend({}, {}, options); options = Chartist.extend({},{},options);
return function perfUnits(chart) { return function perfUnits(chart) {
if(!chart instanceof Chartist.Line) return; if(!chart instanceof Chartist.Line) return;
@ -52,7 +51,7 @@ function perfStuff(window, document, Chartist) {
if(vbits==null) return; if(vbits==null) return;
let tbits = []; let tbits = [];
for(let i = 0; i < vbits.length; i++) { for(let i=0; i<vbits.length; i++) {
tbits[i] = vbits[i].innerHTML; tbits[i] = vbits[i].innerHTML;
} }
log("tbits:",tbits); log("tbits:",tbits);
@ -62,12 +61,11 @@ function perfStuff(window, document, Chartist) {
const matcher = vbits[0].innerHTML; const matcher = vbits[0].innerHTML;
let allMatch = true; let allMatch = true;
for(let i = 0; i < tbits.length; i++) { for(let i=0; i<tbits.length; i++) {
let val = convertPerfUnit(tbits[i], places); let val = convertPerfUnit(tbits[i], places);
if(val!=matcher) allMatch = false; if(val!=matcher) allMatch = false;
vbits[i].innerHTML = val; vbits[i].innerHTML = val;
} }
if(allMatch) calc(places + 1); if(allMatch) calc(places + 1);
} }
calc(0); calc(0);

View File

@ -68,7 +68,7 @@ var sitemapRoutes = map[string]func(http.ResponseWriter, *http.Request) c.RouteE
// TODO: Use a router capable of parsing this rather than hard-coding the logic in // TODO: Use a router capable of parsing this rather than hard-coding the logic in
var fuzzySitemapRoutes = map[string]FuzzyRoute{ var fuzzySitemapRoutes = map[string]FuzzyRoute{
"topics_page_": FuzzyRoute{"topics_page_(%d).xml", SitemapTopic}, "topics_page_": {"topics_page_(%d).xml", SitemapTopic},
} }
func sitemapSwitch(w http.ResponseWriter, r *http.Request) c.RouteError { func sitemapSwitch(w http.ResponseWriter, r *http.Request) c.RouteError {

View File

@ -159,9 +159,12 @@ func ForumsOrderSubmit(w http.ResponseWriter, r *http.Request, u *c.User) c.Rout
} }
updateMap[fid] = index updateMap[fid] = index
} }
c.Forums.UpdateOrder(updateMap) err := c.Forums.UpdateOrder(updateMap)
if err != nil {
return c.InternalErrorJSQ(err, w, r, js)
}
err := c.AdminLogs.Create("reorder", 0, "forum", u.GetIP(), u.ID) err = c.AdminLogs.Create("reorder", 0, "forum", u.GetIP(), u.ID)
if err != nil { if err != nil {
return c.InternalErrorJSQ(err, w, r, js) return c.InternalErrorJSQ(err, w, r, js)
} }