Rudimentary user convo blocking.

Simplify some things.

Add create_block title phrase.
Add remove_block title phrase.
Add create_block_msg phrase.
Add remove_block_msg phrase.
Add profile_unblock phrase.

Add the users_blocks table.

You will need to run the updater / patcher for this commit.
This commit is contained in:
Azareal 2019-10-18 10:35:13 +10:00
parent fd1d54c394
commit 8720de83d8
17 changed files with 430 additions and 247 deletions

View File

@ -431,13 +431,14 @@ func createTables(adapter qgen.Adapter) (err error) {
tC{"target", "int", 0, false, false, ""},
}, nil,
)
*/
createTable("users_blocks", "", "",
[]tC{
tC{"blocker", "int", 0, false, false, ""},
tC{"blockedUser", "int", 0, false, false, ""},
}, nil,
)
*/
createTable("activity_stream_matches", "", "",
[]tC{

View File

@ -207,6 +207,7 @@ type ProfilePage struct {
ProfileOwner User
CurrentScore int
NextScore int
Blocked bool
}
type CreateTopicPage struct {

View File

@ -6,20 +6,27 @@ import (
qgen "github.com/Azareal/Gosora/query_gen"
)
var UserBlocks BlockStore
//var UserFriends FriendStore
type BlockStore interface {
IsBlockedBy(blocker, blockee int) (bool, error)
Add(blocker, blockee int) error
Remove(blocker, blockee int) error
}
type DefaultBlockStore struct {
isBlocked *sql.Stmt
add *sql.Stmt
remove *sql.Stmt
}
func NewDefaultBlockStore(acc *qgen.Accumulator) (*DefaultBlockStore, error) {
return &DefaultBlockStore{
isBlocked: acc.Select("users_blocks").Cols("blocker").Where("blocker = ? AND blockedUser = ?").Prepare(),
add: acc.Insert("users_blocks").Columns("blocker,blockedUser").Fields("?,?").Prepare(),
remove: acc.Delete("users_blocks").Where("blocker = ? AND blockedUser = ?").Prepare(),
}, acc.FirstError()
}
@ -36,6 +43,11 @@ func (s *DefaultBlockStore) Add(blocker, blockee int) error {
return err
}
func (s *DefaultBlockStore) Remove(blocker, blockee int) error {
_, err := s.remove.Exec(blocker, blockee)
return err
}
type FriendInvite struct {
Requester int
Target int

View File

@ -147,12 +147,12 @@ type TItem struct {
type TItemHold map[string]TItem
func (hold TItemHold) Add(name string, expects string, expectsInt interface{}) {
hold[name] = TItem{expects, expectsInt, true}
func (h TItemHold) Add(name string, expects string, expectsInt interface{}) {
h[name] = TItem{expects, expectsInt, true}
}
func (hold TItemHold) AddStd(name string, expects string, expectsInt interface{}) {
hold[name] = TItem{expects, expectsInt, false}
func (h TItemHold) AddStd(name string, expects string, expectsInt interface{}) {
h[name] = TItem{expects, expectsInt, false}
}
// ? - Add template hooks?
@ -169,11 +169,11 @@ func CompileTemplates() error {
}
log.Printf("overriden: %+v\n", overriden)
var config tmpl.CTemplateConfig
config.Minify = Config.MinifyTemplates
config.Debug = Dev.DebugMode
config.SuperDebug = Dev.TemplateDebug
config := tmpl.CTemplateConfig{
Minify: Config.MinifyTemplates,
Debug: Dev.DebugMode,
SuperDebug: Dev.TemplateDebug,
}
c := tmpl.NewCTemplateSet("normal")
c.SetConfig(config)
c.SetBaseImportMap(map[string]string{
@ -296,7 +296,7 @@ func compileTemplates(wg *sync.WaitGroup, c *tmpl.CTemplateSet, themeName string
return err
}
ppage := ProfilePage{htitle("User 526"), replyList, user, 0, 0} // TODO: Use the score from user to generate the currentScore and nextScore
ppage := ProfilePage{htitle("User 526"), replyList, user, 0, 0, false} // TODO: Use the score from user to generate the currentScore and nextScore
t.Add("profile", "c.ProfilePage", ppage)
var topicsList []*TopicsRow

View File

@ -135,6 +135,10 @@ var RouteMap = map[string]interface{}{
"routes.ConvosCreateReplySubmit": routes.ConvosCreateReplySubmit,
"routes.ConvosDeleteReplySubmit": routes.ConvosDeleteReplySubmit,
"routes.ConvosEditReplySubmit": routes.ConvosEditReplySubmit,
"routes.RelationsBlockCreate": routes.RelationsBlockCreate,
"routes.RelationsBlockCreateSubmit": routes.RelationsBlockCreateSubmit,
"routes.RelationsBlockRemove": routes.RelationsBlockRemove,
"routes.RelationsBlockRemoveSubmit": routes.RelationsBlockRemoveSubmit,
"routes.ViewProfile": routes.ViewProfile,
"routes.BanUserSubmit": routes.BanUserSubmit,
"routes.UnbanUser": routes.UnbanUser,
@ -298,53 +302,57 @@ var routeMapEnum = map[string]int{
"routes.ConvosCreateReplySubmit": 109,
"routes.ConvosDeleteReplySubmit": 110,
"routes.ConvosEditReplySubmit": 111,
"routes.ViewProfile": 112,
"routes.BanUserSubmit": 113,
"routes.UnbanUser": 114,
"routes.ActivateUser": 115,
"routes.IPSearch": 116,
"routes.CreateTopicSubmit": 117,
"routes.EditTopicSubmit": 118,
"routes.DeleteTopicSubmit": 119,
"routes.StickTopicSubmit": 120,
"routes.UnstickTopicSubmit": 121,
"routes.LockTopicSubmit": 122,
"routes.UnlockTopicSubmit": 123,
"routes.MoveTopicSubmit": 124,
"routes.LikeTopicSubmit": 125,
"routes.AddAttachToTopicSubmit": 126,
"routes.RemoveAttachFromTopicSubmit": 127,
"routes.ViewTopic": 128,
"routes.CreateReplySubmit": 129,
"routes.ReplyEditSubmit": 130,
"routes.ReplyDeleteSubmit": 131,
"routes.ReplyLikeSubmit": 132,
"routes.AddAttachToReplySubmit": 133,
"routes.RemoveAttachFromReplySubmit": 134,
"routes.ProfileReplyCreateSubmit": 135,
"routes.ProfileReplyEditSubmit": 136,
"routes.ProfileReplyDeleteSubmit": 137,
"routes.PollVote": 138,
"routes.PollResults": 139,
"routes.AccountLogin": 140,
"routes.AccountRegister": 141,
"routes.AccountLogout": 142,
"routes.AccountLoginSubmit": 143,
"routes.AccountLoginMFAVerify": 144,
"routes.AccountLoginMFAVerifySubmit": 145,
"routes.AccountRegisterSubmit": 146,
"routes.AccountPasswordReset": 147,
"routes.AccountPasswordResetSubmit": 148,
"routes.AccountPasswordResetToken": 149,
"routes.AccountPasswordResetTokenSubmit": 150,
"routes.DynamicRoute": 151,
"routes.UploadedFile": 152,
"routes.StaticFile": 153,
"routes.RobotsTxt": 154,
"routes.SitemapXml": 155,
"routes.OpenSearchXml": 156,
"routes.BadRoute": 157,
"routes.HTTPSRedirect": 158,
"routes.RelationsBlockCreate": 112,
"routes.RelationsBlockCreateSubmit": 113,
"routes.RelationsBlockRemove": 114,
"routes.RelationsBlockRemoveSubmit": 115,
"routes.ViewProfile": 116,
"routes.BanUserSubmit": 117,
"routes.UnbanUser": 118,
"routes.ActivateUser": 119,
"routes.IPSearch": 120,
"routes.CreateTopicSubmit": 121,
"routes.EditTopicSubmit": 122,
"routes.DeleteTopicSubmit": 123,
"routes.StickTopicSubmit": 124,
"routes.UnstickTopicSubmit": 125,
"routes.LockTopicSubmit": 126,
"routes.UnlockTopicSubmit": 127,
"routes.MoveTopicSubmit": 128,
"routes.LikeTopicSubmit": 129,
"routes.AddAttachToTopicSubmit": 130,
"routes.RemoveAttachFromTopicSubmit": 131,
"routes.ViewTopic": 132,
"routes.CreateReplySubmit": 133,
"routes.ReplyEditSubmit": 134,
"routes.ReplyDeleteSubmit": 135,
"routes.ReplyLikeSubmit": 136,
"routes.AddAttachToReplySubmit": 137,
"routes.RemoveAttachFromReplySubmit": 138,
"routes.ProfileReplyCreateSubmit": 139,
"routes.ProfileReplyEditSubmit": 140,
"routes.ProfileReplyDeleteSubmit": 141,
"routes.PollVote": 142,
"routes.PollResults": 143,
"routes.AccountLogin": 144,
"routes.AccountRegister": 145,
"routes.AccountLogout": 146,
"routes.AccountLoginSubmit": 147,
"routes.AccountLoginMFAVerify": 148,
"routes.AccountLoginMFAVerifySubmit": 149,
"routes.AccountRegisterSubmit": 150,
"routes.AccountPasswordReset": 151,
"routes.AccountPasswordResetSubmit": 152,
"routes.AccountPasswordResetToken": 153,
"routes.AccountPasswordResetTokenSubmit": 154,
"routes.DynamicRoute": 155,
"routes.UploadedFile": 156,
"routes.StaticFile": 157,
"routes.RobotsTxt": 158,
"routes.SitemapXml": 159,
"routes.OpenSearchXml": 160,
"routes.BadRoute": 161,
"routes.HTTPSRedirect": 162,
}
var reverseRouteMapEnum = map[int]string{
0: "routes.Overview",
@ -459,53 +467,57 @@ var reverseRouteMapEnum = map[int]string{
109: "routes.ConvosCreateReplySubmit",
110: "routes.ConvosDeleteReplySubmit",
111: "routes.ConvosEditReplySubmit",
112: "routes.ViewProfile",
113: "routes.BanUserSubmit",
114: "routes.UnbanUser",
115: "routes.ActivateUser",
116: "routes.IPSearch",
117: "routes.CreateTopicSubmit",
118: "routes.EditTopicSubmit",
119: "routes.DeleteTopicSubmit",
120: "routes.StickTopicSubmit",
121: "routes.UnstickTopicSubmit",
122: "routes.LockTopicSubmit",
123: "routes.UnlockTopicSubmit",
124: "routes.MoveTopicSubmit",
125: "routes.LikeTopicSubmit",
126: "routes.AddAttachToTopicSubmit",
127: "routes.RemoveAttachFromTopicSubmit",
128: "routes.ViewTopic",
129: "routes.CreateReplySubmit",
130: "routes.ReplyEditSubmit",
131: "routes.ReplyDeleteSubmit",
132: "routes.ReplyLikeSubmit",
133: "routes.AddAttachToReplySubmit",
134: "routes.RemoveAttachFromReplySubmit",
135: "routes.ProfileReplyCreateSubmit",
136: "routes.ProfileReplyEditSubmit",
137: "routes.ProfileReplyDeleteSubmit",
138: "routes.PollVote",
139: "routes.PollResults",
140: "routes.AccountLogin",
141: "routes.AccountRegister",
142: "routes.AccountLogout",
143: "routes.AccountLoginSubmit",
144: "routes.AccountLoginMFAVerify",
145: "routes.AccountLoginMFAVerifySubmit",
146: "routes.AccountRegisterSubmit",
147: "routes.AccountPasswordReset",
148: "routes.AccountPasswordResetSubmit",
149: "routes.AccountPasswordResetToken",
150: "routes.AccountPasswordResetTokenSubmit",
151: "routes.DynamicRoute",
152: "routes.UploadedFile",
153: "routes.StaticFile",
154: "routes.RobotsTxt",
155: "routes.SitemapXml",
156: "routes.OpenSearchXml",
157: "routes.BadRoute",
158: "routes.HTTPSRedirect",
112: "routes.RelationsBlockCreate",
113: "routes.RelationsBlockCreateSubmit",
114: "routes.RelationsBlockRemove",
115: "routes.RelationsBlockRemoveSubmit",
116: "routes.ViewProfile",
117: "routes.BanUserSubmit",
118: "routes.UnbanUser",
119: "routes.ActivateUser",
120: "routes.IPSearch",
121: "routes.CreateTopicSubmit",
122: "routes.EditTopicSubmit",
123: "routes.DeleteTopicSubmit",
124: "routes.StickTopicSubmit",
125: "routes.UnstickTopicSubmit",
126: "routes.LockTopicSubmit",
127: "routes.UnlockTopicSubmit",
128: "routes.MoveTopicSubmit",
129: "routes.LikeTopicSubmit",
130: "routes.AddAttachToTopicSubmit",
131: "routes.RemoveAttachFromTopicSubmit",
132: "routes.ViewTopic",
133: "routes.CreateReplySubmit",
134: "routes.ReplyEditSubmit",
135: "routes.ReplyDeleteSubmit",
136: "routes.ReplyLikeSubmit",
137: "routes.AddAttachToReplySubmit",
138: "routes.RemoveAttachFromReplySubmit",
139: "routes.ProfileReplyCreateSubmit",
140: "routes.ProfileReplyEditSubmit",
141: "routes.ProfileReplyDeleteSubmit",
142: "routes.PollVote",
143: "routes.PollResults",
144: "routes.AccountLogin",
145: "routes.AccountRegister",
146: "routes.AccountLogout",
147: "routes.AccountLoginSubmit",
148: "routes.AccountLoginMFAVerify",
149: "routes.AccountLoginMFAVerifySubmit",
150: "routes.AccountRegisterSubmit",
151: "routes.AccountPasswordReset",
152: "routes.AccountPasswordResetSubmit",
153: "routes.AccountPasswordResetToken",
154: "routes.AccountPasswordResetTokenSubmit",
155: "routes.DynamicRoute",
156: "routes.UploadedFile",
157: "routes.StaticFile",
158: "routes.RobotsTxt",
159: "routes.SitemapXml",
160: "routes.OpenSearchXml",
161: "routes.BadRoute",
162: "routes.HTTPSRedirect",
}
var osMapEnum = map[string]int{
"unknown": 0,
@ -663,7 +675,7 @@ type HTTPSRedirect struct {}
func (red *HTTPSRedirect) ServeHTTP(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Connection", "close")
counters.RouteViewCounter.Bump(158)
counters.RouteViewCounter.Bump(162)
dest := "https://" + req.Host + req.URL.String()
http.Redirect(w, req, dest, http.StatusTemporaryRedirect)
}
@ -872,7 +884,7 @@ func (r *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
counters.GlobalViewCounter.Bump()
if prefix == "/s" { //old prefix: /static
counters.RouteViewCounter.Bump(153)
counters.RouteViewCounter.Bump(157)
req.URL.Path += extraData
routes.StaticFile(w, req)
return
@ -1957,9 +1969,59 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
counters.RouteViewCounter.Bump(111)
err = routes.ConvosEditReplySubmit(w,req,user,extraData)
case "/user/block/create/":
err = c.MemberOnly(w,req,user)
if err != nil {
return err
}
counters.RouteViewCounter.Bump(112)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
}
err = routes.RelationsBlockCreate(w,req,user,head,extraData)
case "/user/block/create/submit/":
err = c.NoSessionMismatch(w,req,user)
if err != nil {
return err
}
err = c.MemberOnly(w,req,user)
if err != nil {
return err
}
counters.RouteViewCounter.Bump(113)
err = routes.RelationsBlockCreateSubmit(w,req,user,extraData)
case "/user/block/remove/":
err = c.MemberOnly(w,req,user)
if err != nil {
return err
}
counters.RouteViewCounter.Bump(114)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
}
err = routes.RelationsBlockRemove(w,req,user,head,extraData)
case "/user/block/remove/submit/":
err = c.NoSessionMismatch(w,req,user)
if err != nil {
return err
}
err = c.MemberOnly(w,req,user)
if err != nil {
return err
}
counters.RouteViewCounter.Bump(115)
err = routes.RelationsBlockRemoveSubmit(w,req,user,extraData)
default:
req.URL.Path += extraData
counters.RouteViewCounter.Bump(112)
counters.RouteViewCounter.Bump(116)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -1979,7 +2041,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(113)
counters.RouteViewCounter.Bump(117)
err = routes.BanUserSubmit(w,req,user,extraData)
case "/users/unban/":
err = c.NoSessionMismatch(w,req,user)
@ -1992,7 +2054,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(114)
counters.RouteViewCounter.Bump(118)
err = routes.UnbanUser(w,req,user,extraData)
case "/users/activate/":
err = c.NoSessionMismatch(w,req,user)
@ -2005,7 +2067,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(115)
counters.RouteViewCounter.Bump(119)
err = routes.ActivateUser(w,req,user,extraData)
case "/users/ips/":
err = c.MemberOnly(w,req,user)
@ -2013,7 +2075,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(116)
counters.RouteViewCounter.Bump(120)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -2037,7 +2099,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(117)
counters.RouteViewCounter.Bump(121)
err = routes.CreateTopicSubmit(w,req,user)
case "/topic/edit/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2050,7 +2112,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(118)
counters.RouteViewCounter.Bump(122)
err = routes.EditTopicSubmit(w,req,user,extraData)
case "/topic/delete/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2064,7 +2126,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
}
req.URL.Path += extraData
counters.RouteViewCounter.Bump(119)
counters.RouteViewCounter.Bump(123)
err = routes.DeleteTopicSubmit(w,req,user)
case "/topic/stick/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2077,7 +2139,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(120)
counters.RouteViewCounter.Bump(124)
err = routes.StickTopicSubmit(w,req,user,extraData)
case "/topic/unstick/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2090,7 +2152,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(121)
counters.RouteViewCounter.Bump(125)
err = routes.UnstickTopicSubmit(w,req,user,extraData)
case "/topic/lock/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2104,7 +2166,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
}
req.URL.Path += extraData
counters.RouteViewCounter.Bump(122)
counters.RouteViewCounter.Bump(126)
err = routes.LockTopicSubmit(w,req,user)
case "/topic/unlock/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2117,7 +2179,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(123)
counters.RouteViewCounter.Bump(127)
err = routes.UnlockTopicSubmit(w,req,user,extraData)
case "/topic/move/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2130,7 +2192,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(124)
counters.RouteViewCounter.Bump(128)
err = routes.MoveTopicSubmit(w,req,user,extraData)
case "/topic/like/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2143,7 +2205,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(125)
counters.RouteViewCounter.Bump(129)
err = routes.LikeTopicSubmit(w,req,user,extraData)
case "/topic/attach/add/submit/":
err = c.MemberOnly(w,req,user)
@ -2160,7 +2222,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(126)
counters.RouteViewCounter.Bump(130)
err = routes.AddAttachToTopicSubmit(w,req,user,extraData)
case "/topic/attach/remove/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2173,10 +2235,10 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(127)
counters.RouteViewCounter.Bump(131)
err = routes.RemoveAttachFromTopicSubmit(w,req,user,extraData)
default:
counters.RouteViewCounter.Bump(128)
counters.RouteViewCounter.Bump(132)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -2200,7 +2262,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(129)
counters.RouteViewCounter.Bump(133)
err = routes.CreateReplySubmit(w,req,user)
case "/reply/edit/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2213,7 +2275,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(130)
counters.RouteViewCounter.Bump(134)
err = routes.ReplyEditSubmit(w,req,user,extraData)
case "/reply/delete/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2226,7 +2288,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(131)
counters.RouteViewCounter.Bump(135)
err = routes.ReplyDeleteSubmit(w,req,user,extraData)
case "/reply/like/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2239,7 +2301,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(132)
counters.RouteViewCounter.Bump(136)
err = routes.ReplyLikeSubmit(w,req,user,extraData)
case "/reply/attach/add/submit/":
err = c.MemberOnly(w,req,user)
@ -2256,7 +2318,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(133)
counters.RouteViewCounter.Bump(137)
err = routes.AddAttachToReplySubmit(w,req,user,extraData)
case "/reply/attach/remove/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2269,7 +2331,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(134)
counters.RouteViewCounter.Bump(138)
err = routes.RemoveAttachFromReplySubmit(w,req,user,extraData)
}
case "/profile":
@ -2285,7 +2347,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(135)
counters.RouteViewCounter.Bump(139)
err = routes.ProfileReplyCreateSubmit(w,req,user)
case "/profile/reply/edit/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2298,7 +2360,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(136)
counters.RouteViewCounter.Bump(140)
err = routes.ProfileReplyEditSubmit(w,req,user,extraData)
case "/profile/reply/delete/submit/":
err = c.NoSessionMismatch(w,req,user)
@ -2311,7 +2373,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(137)
counters.RouteViewCounter.Bump(141)
err = routes.ProfileReplyDeleteSubmit(w,req,user,extraData)
}
case "/poll":
@ -2327,23 +2389,23 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(138)
counters.RouteViewCounter.Bump(142)
err = routes.PollVote(w,req,user,extraData)
case "/poll/results/":
counters.RouteViewCounter.Bump(139)
counters.RouteViewCounter.Bump(143)
err = routes.PollResults(w,req,user,extraData)
}
case "/accounts":
switch(req.URL.Path) {
case "/accounts/login/":
counters.RouteViewCounter.Bump(140)
counters.RouteViewCounter.Bump(144)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
}
err = routes.AccountLogin(w,req,user,head)
case "/accounts/create/":
counters.RouteViewCounter.Bump(141)
counters.RouteViewCounter.Bump(145)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -2360,7 +2422,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(142)
counters.RouteViewCounter.Bump(146)
err = routes.AccountLogout(w,req,user)
case "/accounts/login/submit/":
err = c.ParseForm(w,req,user)
@ -2368,10 +2430,10 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(143)
counters.RouteViewCounter.Bump(147)
err = routes.AccountLoginSubmit(w,req,user)
case "/accounts/mfa_verify/":
counters.RouteViewCounter.Bump(144)
counters.RouteViewCounter.Bump(148)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -2383,7 +2445,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(145)
counters.RouteViewCounter.Bump(149)
err = routes.AccountLoginMFAVerifySubmit(w,req,user)
case "/accounts/create/submit/":
err = c.ParseForm(w,req,user)
@ -2391,10 +2453,10 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(146)
counters.RouteViewCounter.Bump(150)
err = routes.AccountRegisterSubmit(w,req,user)
case "/accounts/password-reset/":
counters.RouteViewCounter.Bump(147)
counters.RouteViewCounter.Bump(151)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -2406,10 +2468,10 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(148)
counters.RouteViewCounter.Bump(152)
err = routes.AccountPasswordResetSubmit(w,req,user)
case "/accounts/password-reset/token/":
counters.RouteViewCounter.Bump(149)
counters.RouteViewCounter.Bump(153)
head, err := c.UserCheck(w,req,&user)
if err != nil {
return err
@ -2421,7 +2483,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
return err
}
counters.RouteViewCounter.Bump(150)
counters.RouteViewCounter.Bump(154)
err = routes.AccountPasswordResetTokenSubmit(w,req,user)
}
/*case "/sitemaps": // TODO: Count these views
@ -2438,7 +2500,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
h.Del("Content-Type")
h.Del("Content-Encoding")
}
counters.RouteViewCounter.Bump(152)
counters.RouteViewCounter.Bump(156)
req.URL.Path += extraData
// TODO: Find a way to propagate errors up from this?
r.UploadHandler(w,req) // TODO: Count these views
@ -2448,7 +2510,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
// TODO: Add support for favicons and robots.txt files
switch(extraData) {
case "robots.txt":
counters.RouteViewCounter.Bump(154)
counters.RouteViewCounter.Bump(158)
return routes.RobotsTxt(w,req)
case "favicon.ico":
gzw, ok := w.(c.GzipResponseWriter)
@ -2462,10 +2524,10 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
routes.StaticFile(w,req)
return nil
case "opensearch.xml":
counters.RouteViewCounter.Bump(156)
counters.RouteViewCounter.Bump(160)
return routes.OpenSearchXml(w,req)
/*case "sitemap.xml":
counters.RouteViewCounter.Bump(155)
counters.RouteViewCounter.Bump(159)
return routes.SitemapXml(w,req)*/
}
return c.NotFound(w,req,nil)
@ -2476,7 +2538,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
r.RUnlock()
if ok {
counters.RouteViewCounter.Bump(151) // TODO: Be more specific about *which* dynamic route it is
counters.RouteViewCounter.Bump(155) // TODO: Be more specific about *which* dynamic route it is
req.URL.Path += extraData
return handle(w,req,user)
}
@ -2487,7 +2549,7 @@ func (r *GenRouter) routeSwitch(w http.ResponseWriter, req *http.Request, user c
} else {
r.DumpRequest(req,"Bad Route")
}
counters.RouteViewCounter.Bump(157)
counters.RouteViewCounter.Bump(161)
return c.NotFound(w,req,nil)
}
return err

View File

@ -144,6 +144,8 @@
"account_level_list":"Level Progress",
"convos":"Conversations",
"convo":"Conversation",
"create_block":"Block User",
"remove_block":"Unblock User",
"panel_dashboard":"Control Panel Dashboard",
"panel_forums":"Forum Manager",
@ -544,6 +546,9 @@
"create_convo_recp":"Recipient/s",
"create_convo_button":"Create Convo",
"create_block_msg":"Are you sure you want to block this user?",
"remove_block_msg":"Are you sure you want to unblock this user?",
"areyousure_head":"Are you sure?",
"areyousure_continue":"Continue",
@ -700,6 +705,7 @@
"profile_unban":"Unban",
"profile_ban":"Ban",
"profile_block":"Block",
"profile_unblock":"Unblock",
"profile_report_user_tooltip":"Report User",
"profile_report_user_aria":"Report User",
"profile_ban_user_head":"Ban User",

View File

@ -49,8 +49,7 @@ func init() {
}
func afterDBInit() (err error) {
err = storeInit()
if err != nil {
if err := storeInit(); err != nil {
return err
}
log.Print("Exitted storeInit")
@ -139,6 +138,10 @@ func storeInit() (err error) {
if err != nil {
return errors.WithStack(err)
}
c.UserBlocks, err = c.NewDefaultBlockStore(acc)
if err != nil {
return errors.WithStack(err)
}
c.GroupPromotions, err = c.NewDefaultGroupPromotionStore(acc)
if err != nil {
return errors.WithStack(err)

View File

@ -5,7 +5,7 @@ import (
"database/sql"
"strconv"
"github.com/Azareal/Gosora/query_gen"
qgen "github.com/Azareal/Gosora/query_gen"
)
type tblColumn = qgen.DBTableColumn
@ -39,6 +39,7 @@ func init() {
addPatch(23, patch23)
addPatch(24, patch24)
addPatch(25, patch25)
addPatch(26, patch26)
}
func patch0(scanner *bufio.Scanner) (err error) {
@ -96,8 +97,8 @@ func patch0(scanner *bufio.Scanner) (err error) {
}
var order int
var mOrder = "mid, name, htmlID, cssClass, position, path, aria, tooltip, guestOnly, memberOnly, staffOnly, adminOnly"
var addMenuItem = func(data map[string]interface{}) error {
mOrder := "mid, name, htmlID, cssClass, position, path, aria, tooltip, guestOnly, memberOnly, staffOnly, adminOnly"
addMenuItem := func(data map[string]interface{}) error {
cols, values := qgen.InterfaceMapToInsertStrings(data, mOrder)
err := execStmt(qgen.Builder.SimpleInsert("menu_items", cols+", order", values+","+strconv.Itoa(order)))
order++
@ -153,7 +154,7 @@ func patch0(scanner *bufio.Scanner) (err error) {
}
func patch1(scanner *bufio.Scanner) error {
var routes = map[string]string{
routes := map[string]string{
"routeAccountEditCriticalSubmit": "routes.AccountEditCriticalSubmit",
"routeAccountEditAvatar": "routes.AccountEditAvatar",
"routeAccountEditAvatarSubmit": "routes.AccountEditAvatarSubmit",
@ -164,7 +165,7 @@ func patch1(scanner *bufio.Scanner) error {
}
func patch2(scanner *bufio.Scanner) error {
var routes = map[string]string{
routes := map[string]string{
"routeLogout": "routes.AccountLogout",
"routeShowAttachment": "routes.ShowAttachment",
"routeChangeTheme": "routes.ChangeTheme",
@ -196,7 +197,7 @@ func patch3(scanner *bufio.Scanner) error {
}
func patch4(scanner *bufio.Scanner) error {
var routes = map[string]string{
routes := map[string]string{
"routeReportSubmit": "routes.ReportSubmit",
"routeAccountEditEmail": "routes.AccountEditEmail",
"routeAccountEditEmailTokenSubmit": "routes.AccountEditEmailTokenSubmit",
@ -264,7 +265,7 @@ func patch4(scanner *bufio.Scanner) error {
}
func patch5(scanner *bufio.Scanner) error {
var routes = map[string]string{
routes := map[string]string{
"routePanelUsers": "panel.Users",
"routePanelUsersEdit": "panel.UsersEdit",
"routePanelUsersEditSubmit": "panel.UsersEditSubmit",
@ -323,7 +324,7 @@ func patch7(scanner *bufio.Scanner) error {
func renameRoutes(routes map[string]string) error {
// ! Don't reuse this function blindly, it doesn't escape apostrophes
var replaceTextWhere = func(replaceThis string, withThis string) error {
replaceTextWhere := func(replaceThis string, withThis string) error {
return execStmt(qgen.Builder.SimpleUpdate("viewchunks", "route = '"+withThis+"'", "route = '"+replaceThis+"'"))
}
@ -338,7 +339,7 @@ func renameRoutes(routes map[string]string) error {
}
func patch8(scanner *bufio.Scanner) error {
var routes = map[string]string{
routes := map[string]string{
"routePanelWordFilter": "panel.WordFilters",
"routePanelWordFiltersCreateSubmit": "panel.WordFiltersCreateSubmit",
"routePanelWordFiltersEdit": "panel.WordFiltersEdit",
@ -418,13 +419,12 @@ func patch10(scanner *bufio.Scanner) error {
err = acc().Select("topics").Cols("tid").EachInt(func(tid int) error {
stid := itoa(tid)
count, err := acc().Count("attachments").Where("originTable = 'topics' and originID = " + stid).Total()
if err != nil {
return err
}
var hasReply = false
hasReply := false
err = acc().Select("replies").Cols("rid").Where("tid = " + stid).Orderby("rid DESC").Limit("1").EachInt(func(rid int) error {
hasReply = true
_, err := acc().Update("topics").Set("lastReplyID = ?, attachCount = ?").Where("tid = "+stid).Exec(rid, count)
@ -461,7 +461,6 @@ func patch11(scanner *bufio.Scanner) error {
// We could probably do something more efficient, but as there shouldn't be too many sites right now, we can probably cheat a little, otherwise it'll take forever to get things done
return acc().Select("topics").Cols("tid").EachInt(func(tid int) error {
stid := itoa(tid)
count, err := acc().Count("attachments").Where("originTable = 'topics' and originID = " + stid).Total()
if err != nil {
return err
@ -473,7 +472,6 @@ func patch11(scanner *bufio.Scanner) error {
/*return acc().Select("replies").Cols("rid").EachInt(func(rid int) error {
srid := itoa(rid)
count, err := acc().Count("attachments").Where("originTable = 'replies' and originID = " + srid).Total()
if err != nil {
return err
@ -740,3 +738,12 @@ func patch24(scanner *bufio.Scanner) error {
func patch25(scanner *bufio.Scanner) error {
return execStmt(qgen.Builder.AddColumn("users_groups_promotions", tC{"posts", "int", 0, false, false, "0"}, nil))
}
func patch26(scanner *bufio.Scanner) error {
return execStmt(qgen.Builder.CreateTable("users_blocks", "", "",
[]tC{
tC{"blocker", "int", 0, false, false, ""},
tC{"blockedUser", "int", 0, false, false, ""},
}, nil,
))
}

View File

@ -92,8 +92,10 @@ func userRoutes() *RouteGroup {
Action("routes.ConvosDeleteReplySubmit", "/user/convo/delete/submit/", "extraData"),
Action("routes.ConvosEditReplySubmit", "/user/convo/edit/submit/", "extraData"),
//MView("routes.RelationsBlockCreate","/user/block/create/","extraData")
//Action("routes.RelationsBlockCreateSubmit","/user/block/create/submit/","extraData")
MView("routes.RelationsBlockCreate", "/user/block/create/", "extraData"),
Action("routes.RelationsBlockCreateSubmit", "/user/block/create/submit/", "extraData"),
MView("routes.RelationsBlockRemove", "/user/block/remove/", "extraData"),
Action("routes.RelationsBlockRemoveSubmit", "/user/block/remove/submit/", "extraData"),
)
}

View File

@ -134,6 +134,14 @@ func ConvosCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User) c.R
if !u.Perms.UseConvos {
return c.LocalError("One of the recipients doesn't have permission to use the conversations system", w, r, user)
}
blocked, err := c.UserBlocks.IsBlockedBy(u.ID, user.ID)
if err != nil {
return c.InternalError(err, w, r)
}
// Supermods can bypass blocks so they can tell people off when they do something stupid or have to convey important information
if blocked && !user.IsSuperMod {
return c.LocalError("You don't have permission to send messages to one of these users.", w, r, user)
}
rlist = append(rlist, u.ID)
}
@ -308,7 +316,7 @@ func ConvosEditReplySubmit(w http.ResponseWriter, r *http.Request, user c.User,
}
func RelationsBlockCreate(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, spid string) c.RouteError {
accountEditHead("create_block", w, r, &user, h)
h.Title = p.GetTitlePhrase("create_block")
pid, err := strconv.Atoi(spid)
if err != nil {
return c.LocalError(p.GetErrorPhrase("id_must_be_integer"), w, r, user)
@ -319,10 +327,69 @@ func RelationsBlockCreate(w http.ResponseWriter, r *http.Request, user c.User, h
} else if err != nil {
return c.InternalError(err, w, r)
}
pi := c.Account{h, "dashboard", "create_block", puser}
return renderTemplate("account", w, r, h, pi)
pi := c.Page{h, nil, c.AreYouSure{"/user/block/create/submit/" + strconv.Itoa(puser.ID), p.GetTmplPhrase("create_block_msg")}}
return renderTemplate("are_you_sure", w, r, h, pi)
}
func RelationsBlockCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, spid string) c.RouteError {
func RelationsBlockCreateSubmit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
pid, err := strconv.Atoi(spid)
if err != nil {
return c.LocalError(p.GetErrorPhrase("id_must_be_integer"), w, r, user)
}
puser, err := c.Users.Get(pid)
if err == sql.ErrNoRows {
return c.LocalError("The user you're trying to block doesn't exist.", w, r, user)
} else if err != nil {
return c.InternalError(err, w, r)
}
if user.ID == puser.ID {
return c.LocalError("You can't block yourself.", w, r, user)
}
err = c.UserBlocks.Add(user.ID, puser.ID)
if err != nil {
return c.InternalError(err, w, r)
}
http.Redirect(w, r, "/user/"+strconv.Itoa(puser.ID), http.StatusSeeOther)
return nil
}
func RelationsBlockRemove(w http.ResponseWriter, r *http.Request, user c.User, h *c.Header, spid string) c.RouteError {
h.Title = p.GetTitlePhrase("remove_block")
pid, err := strconv.Atoi(spid)
if err != nil {
return c.LocalError(p.GetErrorPhrase("id_must_be_integer"), w, r, user)
}
puser, err := c.Users.Get(pid)
if err == sql.ErrNoRows {
return c.LocalError("The user you're trying to block doesn't exist.", w, r, user)
} else if err != nil {
return c.InternalError(err, w, r)
}
pi := c.Page{h, nil, c.AreYouSure{"/user/block/remove/submit/" + strconv.Itoa(puser.ID), p.GetTmplPhrase("remove_block_msg")}}
return renderTemplate("are_you_sure", w, r, h, pi)
}
func RelationsBlockRemoveSubmit(w http.ResponseWriter, r *http.Request, user c.User, spid string) c.RouteError {
pid, err := strconv.Atoi(spid)
if err != nil {
return c.LocalError(p.GetErrorPhrase("id_must_be_integer"), w, r, user)
}
puser, err := c.Users.Get(pid)
if err == sql.ErrNoRows {
return c.LocalError("The user you're trying to unblock doesn't exist.", w, r, user)
} else if err != nil {
return c.InternalError(err, w, r)
}
err = c.UserBlocks.Remove(user.ID, puser.ID)
if err != nil {
return c.InternalError(err, w, r)
}
http.Redirect(w, r, "/user/"+strconv.Itoa(puser.ID), http.StatusSeeOther)
return nil
}

View File

@ -7,7 +7,7 @@ import (
c "github.com/Azareal/Gosora/common"
"github.com/Azareal/Gosora/common/phrases"
"github.com/Azareal/Gosora/query_gen"
qgen "github.com/Azareal/Gosora/query_gen"
)
type ProfileStmts struct {
@ -98,8 +98,7 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user c.User, header *c.
// TODO: Add a hook here
replyList = append(replyList, ru)
}
err = rows.Err()
if err != nil {
if err := rows.Err(); err != nil {
return c.InternalError(err, w, r)
}
@ -107,7 +106,11 @@ func ViewProfile(w http.ResponseWriter, r *http.Request, user c.User, header *c.
prevScore := c.GetLevelScore(puser.Level)
currentScore := puser.Score - prevScore
nextScore := c.GetLevelScore(puser.Level+1) - prevScore
blocked, err := c.UserBlocks.IsBlockedBy(user.ID, puser.ID)
if err != nil {
return c.InternalError(err, w, r)
}
ppage := c.ProfilePage{header, replyList, *puser, currentScore, nextScore}
ppage := c.ProfilePage{header, replyList, *puser, currentScore, nextScore, blocked}
return renderTemplate("profile", w, r, header, ppage)
}

View File

@ -0,0 +1,4 @@
CREATE TABLE [users_blocks] (
[blocker] int not null,
[blockedUser] int not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE `users_blocks` (
`blocker` int not null,
`blockedUser` int not null
);

View File

@ -0,0 +1,4 @@
CREATE TABLE "users_blocks" (
`blocker` int not null,
`blockedUser` int not null
);

View File

@ -1,5 +1,5 @@
{{template "header.html" . }}
<main>
<main id="are_you_sure">
<div class="rowblock rowhead">
<div class="rowitem"><h1>{{lang "areyousure_head"}}</h1></div>
</div>

View File

@ -37,6 +37,9 @@
{{if .ProfileOwner.IsBanned}}<a href="/users/unban/{{.ProfileOwner.ID}}?s={{.CurrentUser.Session}}" class="profile_menu_item">{{lang "profile_unban"}}</a>
{{else}}<a href="#ban_user" class="profile_menu_item">{{lang "profile_ban"}}</a>{{end}}
</div>{{end}}
<div class="rowitem passive">
{{if .Blocked}}<a href="/user/block/remove/{{.ProfileOwner.ID}}" class="profile_menu_item">{{lang "profile_unblock"}}</a>{{else}}<a href="/user/block/create/{{.ProfileOwner.ID}}" class="profile_menu_item">{{lang "profile_block"}}</a>{{end}}
</div>
<div class="rowitem passive">
<a href="/report/submit/{{.ProfileOwner.ID}}?s={{.CurrentUser.Session}}&type=user" class="profile_menu_item report_item" aria-label="{{lang "profile_report_user_aria"}}" title="{{lang "profile_report_user_tooltip"}}"></a>
</div>

View File

@ -343,6 +343,10 @@ h1, h2, h3, h4, h5 {
padding: 4px;
margin-bottom: 0px;
}
#are_you_sure .rowblock .rowitem.passive {
display: flex;
flex-direction: column;
}
.rowhead, .opthead, .colstack_head {
margin-left: 8px;