commit 8c1cdb63c5b2b350f54fb351af36b71de6058888
parent e9c7b7398d45b533abc0477780ab61edd0162564
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Mon, 12 Aug 2024 17:06:26 -0700
add msgs count limit to spam filters
Diffstat:
6 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/cmd/dkf/migrations/163.sql b/cmd/dkf/migrations/163.sql
@@ -0,0 +1,4 @@
+-- +migrate Up
+ALTER TABLE spam_filters ADD COLUMN nb_msg INTEGER NOT NULL DEFAULT 0;
+
+-- +migrate Down
diff --git a/pkg/database/tableSpamFilters.go b/pkg/database/tableSpamFilters.go
@@ -7,6 +7,7 @@ type SpamFilter struct {
Action int64
Filter string
IsRegex bool
+ NbMsg int64
CreatedAt time.Time
}
@@ -15,11 +16,12 @@ func (d *DkfDB) GetSpamFilters() (out []SpamFilter, err error) {
return
}
-func (d *DkfDB) CreateOrEditSpamFilter(id int64, filter string, isRegex bool, action int64) (out SpamFilter, err error) {
+func (d *DkfDB) CreateOrEditSpamFilter(id int64, filter string, isRegex bool, action, nbMsg int64) (out SpamFilter, err error) {
out.ID = id
out.Filter = filter
out.IsRegex = isRegex
out.Action = action
+ out.NbMsg = nbMsg
err = d.db.Save(&out).Error
return
}
diff --git a/pkg/web/handlers/admin.go b/pkg/web/handlers/admin.go
@@ -38,12 +38,13 @@ func AdminSpamFiltersHandler(c echo.Context) error {
data.Filter = c.Request().PostFormValue("filter")
data.IsRegex = utils.DoParseBool(c.Request().PostFormValue("is_regex"))
data.Action = utils.Clamp(utils.DoParseInt64(c.Request().PostFormValue("action")), 0, 2)
+ data.NbMsg = utils.Clamp(utils.DoParseInt64(c.Request().PostFormValue("nb_msg")), 0, 100)
if !utils.ValidateRuneLength(data.Filter, 1, 255) {
data.Error = "filter must be within 1-255 characters"
return c.Render(http.StatusOK, "admin.spam-filter", data)
}
if data.ID == 0 || btnSubmit == "edit" {
- if _, err := db.CreateOrEditSpamFilter(data.ID, data.Filter, data.IsRegex, data.Action); err != nil {
+ if _, err := db.CreateOrEditSpamFilter(data.ID, data.Filter, data.IsRegex, data.Action, data.NbMsg); err != nil {
logrus.Error(err)
}
interceptors.LoadFilters(db)
diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go
@@ -926,6 +926,7 @@ type adminSpamFiltersData struct {
Filter string
IsRegex bool
Action int64
+ NbMsg int64
Error string
}
diff --git a/pkg/web/handlers/interceptors/spamInterceptor.go b/pkg/web/handlers/interceptors/spamInterceptor.go
@@ -22,6 +22,7 @@ type Filter struct {
Rgx *regexp.Regexp
Kick bool
Hb bool
+ NbMsg int64
}
var filters []Filter
@@ -44,6 +45,7 @@ func LoadFilters(db *database.DkfDB) {
} else {
f.Term = dbFilter.Filter
}
+ f.NbMsg = dbFilter.NbMsg
filters = append(filters, f)
}
}
@@ -57,11 +59,15 @@ func checkDynamicFilters(c *command.Command, lowerCaseMessage string, silentSelf
(!f.IsRegex && strings.Contains(lowerCaseMessage, f.Term))
if isMatch {
if f.Hb {
- dutils.SelfHellBan(c.DB, c.AuthUser)
- return ErrSilent
+ if f.NbMsg == 0 || c.AuthUser.GeneralMessagesCount <= f.NbMsg {
+ dutils.SelfHellBan(c.DB, c.AuthUser)
+ return ErrSilent
+ }
}
if f.Kick {
- _ = dutils.SelfKick(c.DB, *c.AuthUser, silentSelfKick)
+ if f.NbMsg == 0 || c.AuthUser.GeneralMessagesCount <= f.NbMsg {
+ _ = dutils.SelfKick(c.DB, *c.AuthUser, silentSelfKick)
+ }
}
return ErrSpamFilterTriggered
}
diff --git a/pkg/web/public/views/pages/admin/spam-filters.gohtml b/pkg/web/public/views/pages/admin/spam-filters.gohtml
@@ -17,6 +17,7 @@
<tr>
<th>Filter</th>
<th>Is regex</th>
+ <th>Nb msg</th>
<th>Action</th>
<th>Actions</th>
</tr>
@@ -37,6 +38,7 @@
<label class="form-check-label" for="is_regex_{{ .ID }}">regex</label>
</div>
</td>
+ <td><input type="number" name="nb_msg" min="0" max="100" value="{{ .NbMsg }}" /></td>
<td>
<select name="action" class="form-control form-control-sm">
<option value="1"{{ if eq .Action 1 }} selected{{ end }}>Kick</option>
@@ -64,6 +66,7 @@
<label class="form-check-label" for="is_regex">regex</label>
</div>
</td>
+ <td><input type="number" name="nb_msg" min="0" max="100" value="0" /></td>
<td>
<select name="action" class="form-control form-control-sm">
<option value="1" selected>Kick</option>