Skip to content

Commit ed06f90

Browse files
committed
db.d: add method for removing all excessive tickers
1 parent 920a90c commit ed06f90

File tree

2 files changed

+26
-31
lines changed

2 files changed

+26
-31
lines changed

src/db.d

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ module soulfind.db;
77
@safe:
88

99
import soulfind.defines : blue, default_max_users, default_motd, default_port,
10-
default_private_mode, log_db, norm, RoomMemberType,
11-
RoomTicker, RoomType, SearchFilterType, UserStats;
10+
default_private_mode, log_db, max_room_tickers, norm,
11+
RoomMemberType, RoomTicker, RoomType,
12+
SearchFilterType, UserStats;
1213
import std.array : Appender;
1314
import std.conv : ConvException, text, to;
1415
import std.datetime : Clock, days, Duration, SysTime, UTC;
@@ -1147,19 +1148,30 @@ final class Database
11471148
return true;
11481149
}
11491150

1150-
string del_oldest_ticker(string room_name)
1151+
bool del_excessive_tickers(string room_name)
11511152
{
1153+
if (num_room_tickers(room_name) <= max_room_tickers)
1154+
return false;
1155+
11521156
enum sql = text(
1153-
"SELECT username FROM ", tickers_table, " WHERE room = ? LIMIT 1;"
1157+
"DELETE FROM ", tickers_table, " WHERE rowid IN (",
1158+
" SELECT rowid FROM ", tickers_table,
1159+
" WHERE room = ?",
1160+
" ORDER BY rowid DESC",
1161+
" LIMIT -1 OFFSET ?",
1162+
");",
11541163
);
1155-
const res = query(sql, [room_name]);
1156-
string username;
1164+
query(sql, [room_name, max_room_tickers.text]);
11571165

1158-
if (res.length > 0) {
1159-
username = res[0][0];
1160-
del_ticker(room_name, username);
1161-
}
1162-
return username;
1166+
const num_deleted = changes();
1167+
if (num_deleted == 0)
1168+
return false;
1169+
1170+
if (log_db) writeln(
1171+
"[DB] Removed ", num_deleted.text, " excessive tickers from room ",
1172+
blue, room_name, norm
1173+
);
1174+
return true;
11631175
}
11641176

11651177
RoomTicker[] room_tickers(string room_name)

src/server/room.d

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ module soulfind.server.room;
88

99
import soulfind.db : Database;
1010
import soulfind.defines : blue, log_msg, max_chat_message_length,
11-
max_room_ticker_length, max_room_tickers, norm,
12-
RoomTicker, RoomType;
11+
max_room_ticker_length, norm, RoomTicker, RoomType;
1312
import soulfind.server.conns : Logging;
1413
import soulfind.server.messages;
1514
import soulfind.server.user : User;
@@ -148,11 +147,10 @@ final class Room
148147
enum permanent = false;
149148
del_ticker(username, permanent);
150149

151-
if (num_tickers >= max_room_tickers)
152-
del_oldest_ticker ();
153-
154150
scope msg = new SRoomTickerAdd(name, username, content);
155151
send_to_all(msg);
152+
153+
db.del_excessive_tickers(name);
156154
}
157155

158156
void del_ticker(string username, bool permanent = true)
@@ -164,21 +162,6 @@ final class Room
164162
send_to_all(msg);
165163
}
166164

167-
ulong num_tickers()
168-
{
169-
return db.num_room_tickers(name);
170-
}
171-
172-
private void del_oldest_ticker()
173-
{
174-
const username = db.del_oldest_ticker(name);
175-
if (username is null)
176-
return;
177-
178-
scope msg = new SRoomTickerRemove(name, username);
179-
send_to_all(msg);
180-
}
181-
182165
private RoomTicker[] tickers()
183166
{
184167
return db.room_tickers(name);

0 commit comments

Comments
 (0)