Public rank change log: sa_rank_log, written on rank changes, listed on the Staff page
This commit is contained in:
parent
861692c534
commit
611b79cdba
11 changed files with 346 additions and 17 deletions
|
|
@ -780,8 +780,9 @@ func (s *Store) UpdateGroup(ctx context.Context, id int64, name string, immunity
|
|||
}
|
||||
|
||||
// DeleteGroup removes a group and every admin's reference to it. Admins left with no flags or
|
||||
// groups are removed too, which is what makes them regular players again.
|
||||
func (s *Store) DeleteGroup(ctx context.Context, id int64) error {
|
||||
// groups are removed too, which is what makes them regular players again. Members whose rank
|
||||
// changes because of it are logged as changed by by.
|
||||
func (s *Store) DeleteGroup(ctx context.Context, by Actor, id int64) error {
|
||||
tx, err := s.db.BeginTx(ctx, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
@ -794,6 +795,33 @@ func (s *Store) DeleteGroup(ctx context.Context, id int64) error {
|
|||
}
|
||||
return err
|
||||
}
|
||||
type member struct {
|
||||
n int64
|
||||
name string
|
||||
before rankState
|
||||
}
|
||||
var members []member
|
||||
rows, err := tx.QueryContext(ctx, `SELECT DISTINCT a.player_steamid FROM sa_admins a
|
||||
JOIN sa_admins_flags f ON f.admin_id = a.id WHERE f.flag = ? AND a.player_steamid <> 0`, name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for rows.Next() {
|
||||
var m member
|
||||
if err := rows.Scan(&m.n); err != nil {
|
||||
rows.Close()
|
||||
return err
|
||||
}
|
||||
members = append(members, m)
|
||||
}
|
||||
rows.Close()
|
||||
for i := range members {
|
||||
m := &members[i]
|
||||
m.name = adminNameTx(ctx, tx, m.n)
|
||||
if m.before, err = s.rankTx(ctx, tx, m.n); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if _, err := tx.ExecContext(ctx, `DELETE FROM sa_admins_flags WHERE flag = ?`, name); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -803,6 +831,15 @@ func (s *Store) DeleteGroup(ctx context.Context, id int64) error {
|
|||
if err := deleteEmptyAdmins(ctx, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, m := range members {
|
||||
after, err := s.rankTx(ctx, tx, m.n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.logRank(ctx, tx, m.n, m.name, m.before, after, by); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
|
|
@ -816,8 +853,8 @@ func deleteEmptyAdmins(ctx context.Context, tx *sql.Tx) error {
|
|||
|
||||
// SetAdminGroup gives a player exactly one rank (replacing any #group they had), creating a
|
||||
// global admin row if they have none. immunity is stored on the admin row, as css_addadmin does.
|
||||
// ends is nil for no expiry.
|
||||
func (s *Store) SetAdminGroup(ctx context.Context, steamid, name, group string, immunity int, ends *time.Time) error {
|
||||
// ends is nil for no expiry. A change of rank is logged as made by by.
|
||||
func (s *Store) SetAdminGroup(ctx context.Context, by Actor, steamid, name, group string, immunity int, ends *time.Time) error {
|
||||
n, err := parseSID(steamid)
|
||||
if err != nil {
|
||||
return err
|
||||
|
|
@ -827,6 +864,10 @@ func (s *Store) SetAdminGroup(ctx context.Context, steamid, name, group string,
|
|||
return err
|
||||
}
|
||||
defer tx.Rollback()
|
||||
before, err := s.rankTx(ctx, tx, n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var rowID int64
|
||||
err = tx.QueryRowContext(ctx, `SELECT id FROM sa_admins WHERE player_steamid = ? ORDER BY server_id IS NULL DESC, id LIMIT 1`, n).Scan(&rowID)
|
||||
|
|
@ -856,17 +897,40 @@ func (s *Store) SetAdminGroup(ctx context.Context, steamid, name, group string,
|
|||
if _, err := tx.ExecContext(ctx, `INSERT INTO sa_admins_flags (admin_id, flag) VALUES (?, ?)`, rowID, group); err != nil {
|
||||
return err
|
||||
}
|
||||
after, err := s.rankTx(ctx, tx, n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.logRank(ctx, tx, n, name, before, after, by); err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
// RemoveAdmin deletes every sa_admins row for a SteamID, like css_deladmin ... -g.
|
||||
func (s *Store) RemoveAdmin(ctx context.Context, steamid string) error {
|
||||
// RemoveAdmin deletes every sa_admins row for a SteamID, like css_deladmin ... -g, and logs the
|
||||
// lost rank as removed by by.
|
||||
func (s *Store) RemoveAdmin(ctx context.Context, by Actor, steamid string) error {
|
||||
n, err := parseSID(steamid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = s.db.ExecContext(ctx, `DELETE FROM sa_admins WHERE player_steamid = ? AND id <> 0`, n)
|
||||
return err
|
||||
tx, err := s.db.BeginTx(ctx, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer tx.Rollback()
|
||||
before, err := s.rankTx(ctx, tx, n)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
name := adminNameTx(ctx, tx, n)
|
||||
if _, err := tx.ExecContext(ctx, `DELETE FROM sa_admins WHERE player_steamid = ? AND id <> 0`, n); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.logRank(ctx, tx, n, name, before, rankState{}, by); err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Commit()
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------- Writes for penalties
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue