From 0e9c4594462729e684ae1ac90677bf73958294b1 Mon Sep 17 00:00:00 2001 From: Azareal Date: Wed, 21 Aug 2019 08:32:10 +1000 Subject: [PATCH] Adjust convo permissions. Speed up convo_view.html Make ContentLines in ConvoViewRow an int as it should be. Shorten common. in the generated templates. Fix the page titles for the convo panes. Stop non-present users from editing their convo posts but still allow them to delete them, if they somehow have a way to do that. Reduce the amount of boilerplate in the currently broken guilds plugin. --- common/files.go | 2 +- common/pages.go | 5 +- common/template_init.go | 65 +++++++++++++------------ common/templates/templates.go | 44 ++++++++++------- extend/guilds/lib/guild_store.go | 20 ++++---- extend/guilds/plugin_guilds.go | 81 ++++++++++++++++---------------- langs/english.json | 4 +- routes/convos.go | 27 ++++++----- templates/convo.html | 5 +- templates/convo_row.html | 2 +- templates/convo_row_alt.html | 2 +- themes/nox/public/convo.css | 4 ++ 12 files changed, 144 insertions(+), 117 deletions(-) diff --git a/common/files.go b/common/files.go index bbe19dc4..809297f2 100644 --- a/common/files.go +++ b/common/files.go @@ -180,7 +180,7 @@ func (list SFileList) JSTmplInit() error { data = replace(data, "w.Write(", "out += ") data = replace(data, "strconv.Itoa(", "") data = replace(data, "strconv.FormatInt(", "") - data = replace(data, "common.", "") + data = replace(data, "c.", "") data = replace(data, "phrases.", "") data = replace(data, ", 10;", "") data = replace(data, shortName+"_tmpl_phrase_id = RegisterTmplPhraseNames([]string{", "[") diff --git a/common/pages.go b/common/pages.go index c12617f0..271adb7a 100644 --- a/common/pages.go +++ b/common/pages.go @@ -273,14 +273,15 @@ type ConvoViewRow struct { *ConversationPost User *User ClassName string - ContentLines string + ContentLines int + + CanModify bool } type ConvoViewPage struct { *Header Convo *Conversation Posts []ConvoViewRow - CanModify bool Paginator } diff --git a/common/template_init.go b/common/template_init.go index 251301ca..0dc5b8e3 100644 --- a/common/template_init.go +++ b/common/template_init.go @@ -176,7 +176,7 @@ func CompileTemplates() error { c.SetConfig(config) c.SetBaseImportMap(map[string]string{ "io": "io", - "github.com/Azareal/Gosora/common": "github.com/Azareal/Gosora/common", + "github.com/Azareal/Gosora/common": "c github.com/Azareal/Gosora/common", }) c.SetBuildTags("!no_templategen") c.SetOverrideTrack(overriden) @@ -225,12 +225,12 @@ func compileCommons(c *tmpl.CTemplateSet, header *Header, header2 *Header, forum var topicsList []*TopicsRow topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 1, 0, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil}) topicListPage := TopicListPage{htitle("Topic List"), topicsList, forumList, Config.DefaultForum, TopicListSort{"lastupdated", false}, Paginator{[]int{1}, 1, 1}} - out.Add("topics", "common.TopicListPage", topicListPage) + out.Add("topics", "c.TopicListPage", topicListPage) forumItem := BlankForum(1, "general-forum.1", "General Forum", "Where the general stuff happens", true, "all", 0, "", 0) forumPage := ForumPage{htitle("General Forum"), topicsList, forumItem, Paginator{[]int{1}, 1, 1}} - out.Add("forum", "common.ForumPage", forumPage) - out.Add("forums", "common.ForumsPage", ForumsPage{htitle("Forum List"), forumList}) + out.Add("forum", "c.ForumPage", forumPage) + out.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{ PollOption{0, "Nothing"}, @@ -247,8 +247,8 @@ func compileCommons(c *tmpl.CTemplateSet, header *Header, header2 *Header, forum replyList = append(replyList, ru) tpage := TopicPage{htitle("Topic Name"), replyList, topic, &Forum{ID: 1, Name: "Hahaha"}, poll, Paginator{[]int{1}, 1, 1}} tpage.Forum.Link = BuildForumURL(NameToSlug(tpage.Forum.Name), tpage.Forum.ID) - out.Add("topic", "common.TopicPage", tpage) - out.Add("topic_alt", "common.TopicPage", tpage) + out.Add("topic", "c.TopicPage", tpage) + out.Add("topic_alt", "c.TopicPage", tpage) return nil } @@ -296,7 +296,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string } ppage := ProfilePage{htitle("User 526"), replyList, user, 0, 0} // TODO: Use the score from user to generate the currentScore and nextScore - tmpls.Add("profile", "common.ProfilePage", ppage) + tmpls.Add("profile", "c.ProfilePage", ppage) var topicsList []*TopicsRow topicsList = append(topicsList, &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 1, 0, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil}) @@ -318,13 +318,13 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string var pi interface{} switch sp[1] { - case "common.TopicListPage": + case "c.TopicListPage": pi = topicListPage - case "common.ForumPage": + case "c.ForumPage": pi = forumPage - case "common.ProfilePage": + case "c.ProfilePage": pi = ppage - case "common.Page": + case "c.Page": pi = Page{htitle("Something"), tList, nil} default: continue @@ -337,22 +337,27 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string } } - tmpls.AddStd("login", "common.Page", Page{htitle("Login Page"), tList, nil}) - tmpls.AddStd("register", "common.Page", Page{htitle("Registration Page"), tList, "nananana"}) - tmpls.AddStd("error", "common.ErrorPage", ErrorPage{htitle("Error"), "A problem has occurred in the system."}) + tmpls.AddStd("login", "c.Page", Page{htitle("Login Page"), tList, nil}) + tmpls.AddStd("register", "c.Page", Page{htitle("Registration Page"), tList, "nananana"}) + tmpls.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"} - tmpls.AddStd("ip_search", "common.IPSearchPage", ipSearchPage) + tmpls.AddStd("ip_search", "c.IPSearchPage", ipSearchPage) var inter nobreak accountPage := Account{header, "dashboard", "account_own_edit", inter} - tmpls.AddStd("account", "common.Account", accountPage) + tmpls.AddStd("account", "c.Account", accountPage) + + convo := &Conversation{1,user.ID,time.Now(),0,time.Now()} + convoItems := []ConvoViewRow{ConvoViewRow{&ConversationPost{1,1,"hey","",user.ID}, &user, "", 4, true}} + convoPage := ConvoViewPage{header, convo, convoItems, Paginator{[]int{1}, 1, 1}} + tmpls.AddStd("convo", "c.ConvoViewPage", convoPage) basePage := &BasePanelPage{header, PanelStats{}, "dashboard", ReportForumID} - tmpls.AddStd("panel", "common.Panel", Panel{basePage, "panel_dashboard_right", "", "panel_dashboard", inter}) + tmpls.AddStd("panel", "c.Panel", Panel{basePage, "panel_dashboard_right", "", "panel_dashboard", inter}) ges := []GridElement{GridElement{"","", "", 1, "grid_istat", "", "", ""}} - tmpls.AddStd("panel_dashboard", "common.DashGrids", DashGrids{ges,ges}) - //tmpls.AddStd("panel_analytics", "common.PanelAnalytics", Panel{basePage, "panel_dashboard_right","panel_dashboard", inter}) + tmpls.AddStd("panel_dashboard", "c.DashGrids", DashGrids{ges,ges}) + //tmpls.AddStd("panel_analytics", "c.PanelAnalytics", Panel{basePage, "panel_dashboard_right","panel_dashboard", inter}) var writeTemplate = func(name string, content interface{}) { log.Print("Writing template '" + name + "'") @@ -469,7 +474,7 @@ func CompileJSTemplates() error { return err } } - var dirPrefix = "./tmpl_client/" + dirPrefix := "./tmpl_client/" writeTemplateList(c, &wg, dirPrefix) return nil } @@ -478,7 +483,7 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri user, user2, user3 := tmplInitUsers() header, _, _ := tmplInitHeaders(user, user2, user3) now := time.Now() - var varList = make(map[string]tmpl.VarItem) + varList := make(map[string]tmpl.VarItem) c.SetBaseImportMap(map[string]string{ "io": "io", @@ -494,15 +499,15 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri c.SetBaseImportMap(map[string]string{ "io": "io", - "github.com/Azareal/Gosora/common": "github.com/Azareal/Gosora/common", + "github.com/Azareal/Gosora/common": "c github.com/Azareal/Gosora/common", }) // TODO: Fix the import loop so we don't have to use this hack anymore c.SetBuildTags("!no_templategen,tmplgentopic") tmpls := TItemHold(make(map[string]TItem)) - var topicsRow = &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 0, 1, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil} - tmpls.AddStd("topics_topic", "common.TopicsRow", topicsRow) + topicsRow := &TopicsRow{1, "topic-title", "Topic Title", "The topic content.", 1, false, false, now, now, user3.ID, 1, 1, "", "127.0.0.1", 1, 0, 1, 0, 1, "classname", 0, "", &user2, "", 0, &user3, "General", "/forum/general.2", nil} + tmpls.AddStd("topics_topic", "c.TopicsRow", 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{ PollOption{0, "Nothing"}, @@ -523,17 +528,17 @@ func compileJSTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName stri header.Title = "Topic Name" tpage := TopicPage{header, replyList, topic, &Forum{ID: 1, Name: "Hahaha"}, poll, Paginator{[]int{1}, 1, 1}} tpage.Forum.Link = BuildForumURL(NameToSlug(tpage.Forum.Name), tpage.Forum.ID) - tmpls.AddStd("topic_posts", "common.TopicPage", tpage) - tmpls.AddStd("topic_alt_posts", "common.TopicPage", tpage) + tmpls.AddStd("topic_posts", "c.TopicPage", tpage) + tmpls.AddStd("topic_alt_posts", "c.TopicPage", tpage) itemsPerPage := 25 _, page, lastPage := PageOffset(20, 1, itemsPerPage) pageList := Paginate(page, lastPage, 5) - tmpls.AddStd("paginator", "common.Paginator", Paginator{pageList, page, lastPage}) + tmpls.AddStd("paginator", "c.Paginator", Paginator{pageList, page, lastPage}) - tmpls.AddStd("topic_c_edit_post", "common.TopicCEditPost", TopicCEditPost{ID: 0, Source: "", Ref: ""}) - tmpls.AddStd("topic_c_attach_item", "common.TopicCAttachItem", TopicCAttachItem{ID: 1, ImgSrc: "", Path: "", FullPath: ""}) - tmpls.AddStd("topic_c_poll_input", "common.TopicCPollInput", TopicCPollInput{Index:0}) + tmpls.AddStd("topic_c_edit_post", "c.TopicCEditPost", TopicCEditPost{ID: 0, Source: "", Ref: ""}) + tmpls.AddStd("topic_c_attach_item", "c.TopicCAttachItem", TopicCAttachItem{ID: 1, ImgSrc: "", Path: "", FullPath: ""}) + tmpls.AddStd("topic_c_poll_input", "c.TopicCPollInput", TopicCPollInput{Index:0}) tmpls.AddStd("notice", "string", "nonono") diff --git a/common/templates/templates.go b/common/templates/templates.go index 236820a9..7afc7467 100644 --- a/common/templates/templates.go +++ b/common/templates/templates.go @@ -193,7 +193,12 @@ func (c *CTemplateSet) CompileByLoggedin(name string, fileDir string, expects st } var importList string for _, item := range c.importMap { - importList += "import \"" + item + "\"\n" + ispl := strings.Split(item," ") + if len(ispl) > 1 { + importList += "import "+ispl[0]+" \"" + ispl[1] + "\"\n" + } else { + importList += "import \"" + item + "\"\n" + } } fname := strings.TrimSuffix(name, filepath.Ext(name)) @@ -204,7 +209,7 @@ func (c *CTemplateSet) CompileByLoggedin(name string, fileDir string, expects st } fname += "_" + c.themeName } - c.importMap["github.com/Azareal/Gosora/common"] = "github.com/Azareal/Gosora/common" + c.importMap["github.com/Azareal/Gosora/common"] = "c github.com/Azareal/Gosora/common" stub = `package ` + c.config.PackageName + ` ` + importList + ` @@ -215,14 +220,14 @@ import "errors" stub += "// nolint\nfunc init() {\n" if !c.config.SkipHandles && c.themeName == "" { - stub += "\tcommon.Template_" + fname + "_handle = Template_" + fname + "\n" - stub += "\tcommon.Ctemplates = append(common.Ctemplates,\"" + fname + "\")\n" + stub += "\tc.Template_" + fname + "_handle = Template_" + fname + "\n" + stub += "\tc.Ctemplates = append(c.Ctemplates,\"" + fname + "\")\n" } if !c.config.SkipTmplPtrMap { stub += "tmpl := Template_" + fname + "\n" - stub += "\tcommon.TmplPtrMap[\"" + fname + "\"] = &tmpl\n" - stub += "\tcommon.TmplPtrMap[\"o_" + fname + "\"] = tmpl\n" + stub += "\tc.TmplPtrMap[\"" + fname + "\"] = &tmpl\n" + stub += "\tc.TmplPtrMap[\"o_" + fname + "\"] = tmpl\n" } stub += "}\n\n" @@ -361,7 +366,7 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe c.detailf("c.overridenRoots: %+v\n", c.overridenRoots) var outBuf []OutBufferFrame - var rootHold = "tmpl_" + fname + "_vars" + rootHold := "tmpl_" + fname + "_vars" con := CContext{ RootHolder: rootHold, VarHolder: rootHold, @@ -408,7 +413,12 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe } var importList string for _, item := range c.importMap { - importList += "import \"" + item + "\"\n" + ispl := strings.Split(item," ") + if len(ispl) > 1 { + importList += "import "+ispl[0]+" \"" + ispl[1] + "\"\n" + } else { + importList += "import \"" + item + "\"\n" + } } var varString string for _, varItem := range c.varList { @@ -429,14 +439,14 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe fout += "// nolint\nfunc init() {\n" if !c.config.SkipHandles && c.themeName == "" { - fout += "\tcommon.Template_" + fname + "_handle = Template_" + fname + "\n" - fout += "\tcommon.Ctemplates = append(common.Ctemplates,\"" + fname + "\")\n" + fout += "\tc.Template_" + fname + "_handle = Template_" + fname + "\n" + fout += "\tc.Ctemplates = append(c.Ctemplates,\"" + fname + "\")\n" } if !c.config.SkipTmplPtrMap { fout += "tmpl := Template_" + fname + "\n" - fout += "\tcommon.TmplPtrMap[\"" + fname + "\"] = &tmpl\n" - fout += "\tcommon.TmplPtrMap[\"o_" + fname + "\"] = tmpl\n" + fout += "\tc.TmplPtrMap[\"" + fname + "\"] = &tmpl\n" + fout += "\tc.TmplPtrMap[\"o_" + fname + "\"] = tmpl\n" } if len(c.langIndexToName) > 0 { fout += "\t" + fname + "_tmpl_phrase_id = phrases.RegisterTmplPhraseNames([]string{\n" @@ -456,7 +466,7 @@ func (c *CTemplateSet) compile(name string, content string, expects string, expe } ` fout += `var iw http.ResponseWriter - gzw, ok := w.(common.GzipResponseWriter) + gzw, ok := w.(c.GzipResponseWriter) if ok { iw = gzw.ResponseWriter } @@ -1069,7 +1079,7 @@ ArgLoop: val = val3 // TODO: Refactor this - litString("common.BuildWidget("+leftParam+","+rightParam+")", false) + litString("c.BuildWidget("+leftParam+","+rightParam+")", false) break ArgLoop case "hasWidgets": // TODO: Implement string literals properly @@ -1092,7 +1102,7 @@ ArgLoop: val = val3 // TODO: Refactor this - out = "common.HasWidgets(" + leftParam + "," + rightParam + ")" + out = "c.HasWidgets(" + leftParam + "," + rightParam + ")" literal = true break ArgLoop case "lang": @@ -1178,7 +1188,7 @@ ArgLoop: panic("The leftoperand for function buint cannot be left blank") } leftParam, _ := c.compileIfVarSub(con, leftOperand) - out = "{\nbyteFloat, unit := common.ConvertByteUnit(float64(" + leftParam + "))\n" + out = "{\nbyteFloat, unit := c.ConvertByteUnit(float64(" + leftParam + "))\n" out += "w.Write(fmt.Sprintf(\"%.1f\", byteFloat) + unit)\n" literal = true break ArgLoop @@ -1200,7 +1210,7 @@ ArgLoop: } leftParam, _ := c.compileIfVarSub(con, leftOperand) // TODO: Refactor this - litString("common.RelativeTime("+leftParam+")", false) + litString("c.RelativeTime("+leftParam+")", false) break ArgLoop case "scope": literal = true diff --git a/extend/guilds/lib/guild_store.go b/extend/guilds/lib/guild_store.go index d6c30048..ba7f3743 100644 --- a/extend/guilds/lib/guild_store.go +++ b/extend/guilds/lib/guild_store.go @@ -6,7 +6,7 @@ import "github.com/Azareal/Gosora/query_gen" var Gstore GuildStore type GuildStore interface { - Get(guildID int) (guild *Guild, err error) + Get(id int) (guild *Guild, err error) Create(name string, desc string, active bool, privacy int, uid int, fid int) (int, error) } @@ -23,19 +23,19 @@ func NewSQLGuildStore() (*SQLGuildStore, error) { }, acc.FirstError() } -func (store *SQLGuildStore) Close() { - _ = store.get.Close() - _ = store.create.Close() +func (s *SQLGuildStore) Close() { + _ = s.get.Close() + _ = s.create.Close() } -func (store *SQLGuildStore) Get(guildID int) (guild *Guild, err error) { - guild = &Guild{ID: guildID} - err = store.get.QueryRow(guildID).Scan(&guild.Name, &guild.Desc, &guild.Active, &guild.Privacy, &guild.Joinable, &guild.Owner, &guild.MemberCount, &guild.MainForumID, &guild.Backdrop, &guild.CreatedAt, &guild.LastUpdateTime) - return guild, err +func (s *SQLGuildStore) Get(id int) (guild *Guild, err error) { + g = &Guild{ID: id} + err = s.get.QueryRow(guildID).Scan(&g.Name, &g.Desc, &g.Active, &g.Privacy, &g.Joinable, &g.Owner, &g.MemberCount, &g.MainForumID, &g.Backdrop, &g.CreatedAt, &g.LastUpdateTime) + return g, err } -func (store *SQLGuildStore) Create(name string, desc string, active bool, privacy int, uid int, fid int) (int, error) { - res, err := store.create.Exec(name, desc, active, privacy, uid, fid) +func (s *SQLGuildStore) Create(name string, desc string, active bool, privacy int, uid int, fid int) (int, error) { + res, err := s.create.Exec(name, desc, active, privacy, uid, fid) if err != nil { return 0, err } diff --git a/extend/guilds/plugin_guilds.go b/extend/guilds/plugin_guilds.go index ecb0b31c..7285d73c 100644 --- a/extend/guilds/plugin_guilds.go +++ b/extend/guilds/plugin_guilds.go @@ -1,7 +1,7 @@ package main import ( - "github.com/Azareal/Gosora/common" + c "github.com/Azareal/Gosora/common" "github.com/Azareal/Gosora/extend/guilds/lib" ) @@ -9,21 +9,21 @@ import ( // TODO: Add a plugin interface instead of having a bunch of argument to AddPlugin? func init() { - common.Plugins.Add(&common.Plugin{UName: "guilds", Name: "Guilds", Author: "Azareal", URL: "https://github.com/Azareal", Init: initGuilds, Deactivate: deactivateGuilds, Install: installGuilds}) + c.Plugins.Add(&c.Plugin{UName: "guilds", Name: "Guilds", Author: "Azareal", URL: "https://github.com/Azareal", Init: initGuilds, Deactivate: deactivateGuilds, Install: installGuilds}) // TODO: Is it possible to avoid doing this when the plugin isn't activated? - common.PrebuildTmplList = append(common.PrebuildTmplList, guilds.PrebuildTmplList) + c.PrebuildTmplList = append(c.PrebuildTmplList, guilds.PrebuildTmplList) } -func initGuilds(plugin *common.Plugin) (err error) { - plugin.AddHook("intercept_build_widgets", guilds.Widgets) - plugin.AddHook("trow_assign", guilds.TrowAssign) - plugin.AddHook("topic_create_pre_loop", guilds.TopicCreatePreLoop) - plugin.AddHook("pre_render_forum", guilds.PreRenderViewForum) - plugin.AddHook("simple_forum_check_pre_perms", guilds.ForumCheck) - plugin.AddHook("forum_check_pre_perms", guilds.ForumCheck) +func initGuilds(pl *c.Plugin) (err error) { + pl.AddHook("intercept_build_widgets", guilds.Widgets) + pl.AddHook("trow_assign", guilds.TrowAssign) + pl.AddHook("topic_create_pre_loop", guilds.TopicCreatePreLoop) + pl.AddHook("pre_render_forum", guilds.PreRenderViewForum) + pl.AddHook("simple_forum_check_pre_perms", guilds.ForumCheck) + pl.AddHook("forum_check_pre_perms", guilds.ForumCheck) // TODO: Auto-grant this perm to admins upon installation? - common.RegisterPluginPerm("CreateGuild") + c.RegisterPluginPerm("CreateGuild") router.HandleFunc("/guilds/", guilds.RouteGuildList) router.HandleFunc("/guild/", guilds.MiddleViewGuild) router.HandleFunc("/guild/create/", guilds.RouteCreateGuild) @@ -54,14 +54,14 @@ func initGuilds(plugin *common.Plugin) (err error) { return acc.FirstError() } -func deactivateGuilds(plugin *common.Plugin) { - plugin.RemoveHook("intercept_build_widgets", guilds.Widgets) - plugin.RemoveHook("trow_assign", guilds.TrowAssign) - plugin.RemoveHook("topic_create_pre_loop", guilds.TopicCreatePreLoop) - plugin.RemoveHook("pre_render_forum", guilds.PreRenderViewForum) - plugin.RemoveHook("simple_forum_check_pre_perms", guilds.ForumCheck) - plugin.RemoveHook("forum_check_pre_perms", guilds.ForumCheck) - common.DeregisterPluginPerm("CreateGuild") +func deactivateGuilds(pl *common.Plugin) { + pl.RemoveHook("intercept_build_widgets", guilds.Widgets) + pl.RemoveHook("trow_assign", guilds.TrowAssign) + pl.RemoveHook("topic_create_pre_loop", guilds.TopicCreatePreLoop) + pl.RemoveHook("pre_render_forum", guilds.PreRenderViewForum) + pl.RemoveHook("simple_forum_check_pre_perms", guilds.ForumCheck) + pl.RemoveHook("forum_check_pre_perms", guilds.ForumCheck) + c.DeregisterPluginPerm("CreateGuild") _ = router.RemoveFunc("/guilds/") _ = router.RemoveFunc("/guild/") _ = router.RemoveFunc("/guild/create/") @@ -76,22 +76,23 @@ func deactivateGuilds(plugin *common.Plugin) { } // TODO: Stop accessing the query builder directly and add a feature in Gosora which is more easily reversed, if an error comes up during the installation process +type tC = qgen.DBTableColumn func installGuilds(plugin *common.Plugin) error { guildTableStmt, err := qgen.Builder.CreateTable("guilds", "utf8mb4", "utf8mb4_general_ci", - []qgen.DBTableColumn{ - qgen.DBTableColumn{"guildID", "int", 0, false, true, ""}, - qgen.DBTableColumn{"name", "varchar", 100, false, false, ""}, - qgen.DBTableColumn{"desc", "varchar", 200, false, false, ""}, - qgen.DBTableColumn{"active", "boolean", 1, false, false, ""}, - qgen.DBTableColumn{"privacy", "smallint", 0, false, false, ""}, - qgen.DBTableColumn{"joinable", "smallint", 0, false, false, "0"}, - qgen.DBTableColumn{"owner", "int", 0, false, false, ""}, - qgen.DBTableColumn{"memberCount", "int", 0, false, false, ""}, - qgen.DBTableColumn{"mainForum", "int", 0, false, false, "0"}, // The board the user lands on when they click on a group, we'll make it possible for group admins to change what users land on - //qgen.DBTableColumn{"boards","varchar",255,false,false,""}, // Cap the max number of boards at 8 to avoid overflowing the confines of a 64-bit integer? - qgen.DBTableColumn{"backdrop", "varchar", 200, false, false, ""}, // File extension for the uploaded file, or an external link - qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""}, - qgen.DBTableColumn{"lastUpdateTime", "datetime", 0, false, false, ""}, + []tC{ + tC{"guildID", "int", 0, false, true, ""}, + tC{"name", "varchar", 100, false, false, ""}, + tC{"desc", "varchar", 200, false, false, ""}, + tC{"active", "boolean", 1, false, false, ""}, + tC{"privacy", "smallint", 0, false, false, ""}, + tC{"joinable", "smallint", 0, false, false, "0"}, + tC{"owner", "int", 0, false, false, ""}, + tC{"memberCount", "int", 0, false, false, ""}, + tC{"mainForum", "int", 0, false, false, "0"}, // The board the user lands on when they click on a group, we'll make it possible for group admins to change what users land on + //tC{"boards","varchar",255,false,false,""}, // Cap the max number of boards at 8 to avoid overflowing the confines of a 64-bit integer? + tC{"backdrop", "varchar", 200, false, false, ""}, // File extension for the uploaded file, or an external link + tC{"createdAt", "createdAt", 0, false, false, ""}, + tC{"lastUpdateTime", "datetime", 0, false, false, ""}, }, []qgen.DBTableKey{ qgen.DBTableKey{"guildID", "primary"}, @@ -107,12 +108,12 @@ func installGuilds(plugin *common.Plugin) error { } guildMembersTableStmt, err := qgen.Builder.CreateTable("guilds_members", "", "", - []qgen.DBTableColumn{ - qgen.DBTableColumn{"guildID", "int", 0, false, false, ""}, - qgen.DBTableColumn{"uid", "int", 0, false, false, ""}, - qgen.DBTableColumn{"rank", "int", 0, false, false, "0"}, /* 0: Member. 1: Mod. 2: Admin. */ - qgen.DBTableColumn{"posts", "int", 0, false, false, "0"}, /* Per-Group post count. Should we do some sort of score system? */ - qgen.DBTableColumn{"joinedAt", "datetime", 0, false, false, ""}, + []tC{ + tC{"guildID", "int", 0, false, false, ""}, + tC{"uid", "int", 0, false, false, ""}, + tC{"rank", "int", 0, false, false, "0"}, /* 0: Member. 1: Mod. 2: Admin. */ + tC{"posts", "int", 0, false, false, "0"}, /* Per-Group post count. Should we do some sort of score system? */ + tC{"joinedAt", "datetime", 0, false, false, ""}, }, nil, ) if err != nil { @@ -124,6 +125,6 @@ func installGuilds(plugin *common.Plugin) error { } // TO-DO; Implement an uninstallation system into Gosora. And a better installation system. -func uninstallGuilds(plugin *common.Plugin) error { +func uninstallGuilds(plugin *c.Plugin) error { return nil } diff --git a/langs/english.json b/langs/english.json index 23d9dc2e..102a33e6 100644 --- a/langs/english.json +++ b/langs/english.json @@ -143,8 +143,8 @@ "account_logins":"Logins", "account_penalties":"Penalties", "account_level_list":"Level Progress", - "convos_head":"Conversations", - "convo_head":"Conversation", + "convos":"Conversations", + "convo":"Conversation", "panel_dashboard":"Control Panel Dashboard", "panel_forums":"Forum Manager", diff --git a/routes/convos.go b/routes/convos.go index 8e62ba28..92e52855 100644 --- a/routes/convos.go +++ b/routes/convos.go @@ -63,15 +63,15 @@ func Convo(w http.ResponseWriter, r *http.Request, user c.User, header *c.Header pitems := make([]c.ConvoViewRow, len(posts)) for i, post := range posts { - user, err := c.Users.Get(post.CreatedBy) + uuser, err := c.Users.Get(post.CreatedBy) if err != nil { return c.InternalError(err, w, r) } - pitems[i] = c.ConvoViewRow{post, user, "", "4"} + canModify := user.ID == post.CreatedBy || user.IsSuperMod + pitems[i] = c.ConvoViewRow{post, uuser, "", 4, canModify} } - canModify := user.ID == convo.CreatedBy || user.IsSuperMod - pi := c.Account{header, "dashboard", "convo", c.ConvoViewPage{header, convo, pitems, canModify, c.Paginator{pageList, page, lastPage}}} + pi := c.Account{header, "dashboard", "convo", c.ConvoViewPage{header, convo, pitems, c.Paginator{pageList, page, lastPage}}} return renderTemplate("account", w, r, header, pi) } @@ -89,7 +89,7 @@ func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.R return ferr } if user.IsBanned { - return c.NoPermissions(w,r,user) + return c.NoPermissions(w, r, user) } recps := c.SanitiseSingleLine(r.PostFormValue("recp")) @@ -145,7 +145,7 @@ func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user c.User return ferr } if user.IsBanned { - return c.NoPermissions(w,r,user) + return c.NoPermissions(w, r, user) } cid, err := strconv.Atoi(scid) if err != nil { @@ -163,7 +163,7 @@ func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user c.User return c.NotFound(w, r, nil) } if !convo.Has(user.ID) { - return c.LocalError("You are not in this conversation.",w,r,user) + return c.LocalError("You are not in this conversation.", w, r, user) } body := c.PreparseMessage(r.PostFormValue("content")) @@ -173,7 +173,7 @@ func ConvosCreateReplySubmit(w http.ResponseWriter, r *http.Request, user c.User return c.InternalError(err, w, r) } - http.Redirect(w, r, "/user/convo/" + strconv.Itoa(convo.ID), http.StatusSeeOther) + http.Redirect(w, r, "/user/convo/"+strconv.Itoa(convo.ID), http.StatusSeeOther) return nil } @@ -205,8 +205,8 @@ func ConvosDeleteReplySubmit(w http.ResponseWriter, r *http.Request, user c.User if pcount == 0 { return c.NotFound(w, r, nil) } - if user.ID != convo.CreatedBy && !user.IsSuperMod { - return c.NoPermissions(w,r,user) + if user.ID != post.CreatedBy && !user.IsSuperMod { + return c.NoPermissions(w, r, user) } posts, err := convo.Posts(0, c.Config.ItemsPerPage) @@ -259,8 +259,11 @@ func ConvosEditReplySubmit(w http.ResponseWriter, r *http.Request, user c.User, if pcount == 0 { return c.NotFound(w, r, nil) } - if user.ID != convo.CreatedBy && !user.IsSuperMod { - return c.NoPermissions(w,r,user) + if user.ID != post.CreatedBy && !user.IsSuperMod { + return c.NoPermissions(w, r, user) + } + if !convo.Has(user.ID) { + return c.LocalError("You are not in this conversation.", w, r, user) } post.Body = c.PreparseMessage(r.PostFormValue("edit_item")) diff --git a/templates/convo.html b/templates/convo.html index 2cfbfcfd..3be914ce 100644 --- a/templates/convo.html +++ b/templates/convo.html @@ -3,7 +3,10 @@

{{lang "convo_head"}}

-
{{template "convo_row.html" . }}
+
+
Participants: Blah, Blah 2, Blah 3
+
+
{{template "convo_row.html" .}}
{{if not .CurrentUser.IsBanned}}
diff --git a/templates/convo_row.html b/templates/convo_row.html index f6ca01de..cbc31d53 100644 --- a/templates/convo_row.html +++ b/templates/convo_row.html @@ -6,7 +6,7 @@ {{.User.Name}}   - {{if $.CanModify}} + {{if .CanModify}} {{end}} diff --git a/templates/convo_row_alt.html b/templates/convo_row_alt.html index eb5ab6a1..064b9b56 100644 --- a/templates/convo_row_alt.html +++ b/templates/convo_row_alt.html @@ -9,7 +9,7 @@
- {{if $.CanModify}} + {{if .CanModify}} diff --git a/themes/nox/public/convo.css b/themes/nox/public/convo.css index 8fa5be33..310d30cb 100644 --- a/themes/nox/public/convo.css +++ b/themes/nox/public/convo.css @@ -1,3 +1,7 @@ +.parti { + margin-bottom: 8px; +} + .rowitem .topRow { display: flex; width: 100%;