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.
This commit is contained in:
Azareal 2019-08-21 08:32:10 +10:00
parent f8991e089a
commit 0e9c459446
12 changed files with 144 additions and 117 deletions

View File

@ -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{", "[")

View File

@ -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
}

View File

@ -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")

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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",

View File

@ -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"))

View File

@ -3,7 +3,10 @@
<h1>{{lang "convo_head"}}</h1>
</div>
</div>
<div class="colstack_item hash_hide">{{template "convo_row.html" . }}</div>
<div class="colstack_item parti">
<div class="rowitem">Participants: Blah, Blah 2, Blah 3</div>
</div>
<div class="colstack_item">{{template "convo_row.html" .}}</div>
{{if not .CurrentUser.IsBanned}}
<form action="/user/convo/create/submit/{{.Convo.ID}}?s={{.CurrentUser.Session}}" method="post">
<div class="colstack_item topic_reply_form" style="border-top:none;">

View File

@ -6,7 +6,7 @@
<span class="controls">
<a href="{{.User.Link}}" class="real_username username">{{.User.Name}}</a>&nbsp;&nbsp;
{{if $.CanModify}}<a href="/user/convo/edit/submit/{{.ID}}?s={{$.CurrentUser.Session}}" class="mod_button" title="{{lang "profile_comments_edit_tooltip"}}" aria-label="{{lang "profile_comments_edit_aria"}}"><button class="username edit_item edit_label"></button></a>
{{if .CanModify}}<a href="/user/convo/edit/submit/{{.ID}}?s={{$.CurrentUser.Session}}" class="mod_button" title="{{lang "profile_comments_edit_tooltip"}}" aria-label="{{lang "profile_comments_edit_aria"}}"><button class="username edit_item edit_label"></button></a>
<a href="/user/convo/delete/submit/{{.ID}}?s={{$.CurrentUser.Session}}" class="mod_button" title="{{lang "profile_comments_delete_tooltip"}}" aria-label="{{lang "profile_comments_delete_aria"}}"><button class="username delete_item delete_label"></button></a>{{end}}

View File

@ -9,7 +9,7 @@
</span>
</div>
<span class="controls">
{{if $.CanModify}}
{{if .CanModify}}
<a href="/user/convo/edit/submit/{{.ID}}?s={{$.CurrentUser.Session}}" class="mod_button" title="{{lang "profile_comments_edit_tooltip"}}" aria-label="{{lang "profile_comments_edit_aria"}}"><button class="username edit_item edit_label"></button></a>
<a href="/user/convo/delete/submit/{{.ID}}?s={{$.CurrentUser.Session}}" class="mod_button" title="{{lang "profile_comments_delete_tooltip"}}" aria-label="{{lang "profile_comments_delete_aria"}}"><button class="username delete_item delete_label"></button></a>

View File

@ -1,3 +1,7 @@
.parti {
margin-bottom: 8px;
}
.rowitem .topRow {
display: flex;
width: 100%;