@@ -3106,10 +3106,11 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
31063106 // Get their names for logging purposes.
31073107 $ admins = [];
31083108 $ user_log_details = [];
3109+ $ emails = [];
31093110
31103111 $ request = Db::$ db ->query (
31113112 'SELECT
3112- id_member, member_name, is_activated,
3113+ id_member, member_name, is_activated, email_address,
31133114 CASE WHEN id_group = {int:admin_group} OR FIND_IN_SET({int:admin_group}, additional_groups) != 0 THEN 1 ELSE 0 END AS is_admin
31143115 FROM {db_prefix}members
31153116 WHERE id_member IN ({array_int:user_list})
@@ -3127,6 +3128,7 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
31273128 }
31283129
31293130 $ user_log_details [$ row ['id_member ' ]] = $ row ;
3131+ $ emails [] = $ row ['email_address ' ];
31303132 }
31313133 Db::$ db ->free_result ($ request );
31323134
@@ -3182,263 +3184,91 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
31823184 }
31833185 }
31843186
3185- // Make these peoples' posts guest posts.
3186- Db::$ db ->query (
3187- 'UPDATE {db_prefix}messages
3188- SET id_member = {int:guest_id}
3189- WHERE id_member IN ({array_int:users}) ' ,
3190- [
3191- 'guest_id ' => 0 ,
3192- 'users ' => $ users ,
3193- ],
3194- );
3195-
3196- Db::$ db ->query (
3197- 'UPDATE {db_prefix}polls
3198- SET id_member = {int:guest_id}
3199- WHERE id_member IN ({array_int:users}) ' ,
3200- [
3201- 'guest_id ' => 0 ,
3202- 'users ' => $ users ,
3203- ],
3204- );
3205-
3206- // Make these peoples' posts guest first posts and last posts.
3207- Db::$ db ->query (
3208- 'UPDATE {db_prefix}topics
3209- SET id_member_started = {int:guest_id}
3210- WHERE id_member_started IN ({array_int:users}) ' ,
3211- [
3212- 'guest_id ' => 0 ,
3213- 'users ' => $ users ,
3214- ],
3215- );
3216-
3217- Db::$ db ->query (
3218- 'UPDATE {db_prefix}topics
3219- SET id_member_updated = {int:guest_id}
3220- WHERE id_member_updated IN ({array_int:users}) ' ,
3221- [
3222- 'guest_id ' => 0 ,
3223- 'users ' => $ users ,
3224- ],
3225- );
3226-
3227- Db::$ db ->query (
3228- 'UPDATE {db_prefix}log_actions
3229- SET id_member = {int:guest_id}
3230- WHERE id_member IN ({array_int:users}) ' ,
3231- [
3232- 'guest_id ' => 0 ,
3233- 'users ' => $ users ,
3234- ],
3235- );
3236-
3237- Db::$ db ->query (
3238- 'UPDATE {db_prefix}log_banned
3239- SET id_member = {int:guest_id}
3240- WHERE id_member IN ({array_int:users}) ' ,
3241- [
3242- 'guest_id ' => 0 ,
3243- 'users ' => $ users ,
3244- ],
3245- );
3246-
3247- Db::$ db ->query (
3248- 'UPDATE {db_prefix}log_errors
3249- SET id_member = {int:guest_id}
3250- WHERE id_member IN ({array_int:users}) ' ,
3251- [
3252- 'guest_id ' => 0 ,
3253- 'users ' => $ users ,
3254- ],
3255- );
3256-
3257- // Delete the member.
3258- Db::$ db ->query (
3259- 'DELETE FROM {db_prefix}members
3260- WHERE id_member IN ({array_int:users}) ' ,
3261- [
3262- 'users ' => $ users ,
3263- ],
3264- );
3265-
3266- // Delete any drafts...
3267- Db::$ db ->query (
3268- 'DELETE FROM {db_prefix}user_drafts
3269- WHERE id_member IN ({array_int:users}) ' ,
3270- [
3271- 'users ' => $ users ,
3272- ],
3273- );
3274-
3275- // Delete anything they liked.
3276- Db::$ db ->query (
3277- 'DELETE FROM {db_prefix}user_likes
3278- WHERE id_member IN ({array_int:users}) ' ,
3279- [
3280- 'users ' => $ users ,
3281- ],
3282- );
3283-
3284- // Delete their mentions
3285- Db::$ db ->query (
3286- 'DELETE FROM {db_prefix}mentions
3287- WHERE id_member IN ({array_int:members}) ' ,
3288- [
3289- 'members ' => $ users ,
3290- ],
3291- );
3292-
3293- // Delete the logs...
3294- Db::$ db ->query (
3295- 'DELETE FROM {db_prefix}log_actions
3296- WHERE id_log = {int:log_type}
3297- AND id_member IN ({array_int:users}) ' ,
3298- [
3299- 'log_type ' => 2 ,
3300- 'users ' => $ users ,
3301- ],
3302- );
3303-
3304- Db::$ db ->query (
3305- 'DELETE FROM {db_prefix}log_boards
3306- WHERE id_member IN ({array_int:users}) ' ,
3307- [
3308- 'users ' => $ users ,
3309- ],
3310- );
3311-
3312- Db::$ db ->query (
3313- 'DELETE FROM {db_prefix}log_comments
3314- WHERE id_recipient IN ({array_int:users})
3315- AND comment_type = {string:warntpl} ' ,
3316- [
3317- 'users ' => $ users ,
3318- 'warntpl ' => 'warntpl ' ,
3319- ],
3320- );
3321-
3322- Db::$ db ->query (
3323- 'DELETE FROM {db_prefix}log_group_requests
3324- WHERE id_member IN ({array_int:users}) ' ,
3325- [
3326- 'users ' => $ users ,
3327- ],
3328- );
3329-
3330- Db::$ db ->query (
3331- 'DELETE FROM {db_prefix}log_mark_read
3332- WHERE id_member IN ({array_int:users}) ' ,
3333- [
3334- 'users ' => $ users ,
3335- ],
3336- );
3337-
3338- Db::$ db ->query (
3339- 'DELETE FROM {db_prefix}log_notify
3340- WHERE id_member IN ({array_int:users}) ' ,
3341- [
3342- 'users ' => $ users ,
3343- ],
3344- );
3345-
3346- Db::$ db ->query (
3347- 'DELETE FROM {db_prefix}log_online
3348- WHERE id_member IN ({array_int:users}) ' ,
3349- [
3350- 'users ' => $ users ,
3351- ],
3352- );
3353-
3354- Db::$ db ->query (
3355- 'DELETE FROM {db_prefix}log_subscribed
3356- WHERE id_member IN ({array_int:users}) ' ,
3357- [
3358- 'users ' => $ users ,
3359- ],
3360- );
3187+ $ set_tables = [
3188+ // Make these peoples' posts guest posts.
3189+ ['messages ' , 'id_member ' ],
3190+ ['polls ' , 'id_member ' ],
3191+ // Make these peoples' posts guest first posts and last posts.
3192+ ['topics ' , 'id_member_started ' ],
3193+ ['topics ' , 'id_member_updated ' ],
3194+ ['log_actions ' , 'id_member ' ],
3195+ ['log_banned ' , 'id_member ' ],
3196+ ['log_errors ' , 'id_member ' ],
3197+ ['log_reported ' , 'id_member ' ],
3198+ ['log_reported_comments ' , 'id_member ' ],
3199+ // Make their votes appear as guest votes - at least it keeps the totals right.
3200+ // @todo Consider adding back in cookie protection.
3201+ ['log_polls ' , 'id_member ' ],
3202+ ];
33613203
3362- Db::$ db ->query (
3363- 'DELETE FROM {db_prefix}log_topics
3364- WHERE id_member IN ({array_int:users}) ' ,
3365- [
3366- 'users ' => $ users ,
3367- ],
3368- );
3204+ $ delete_tables = [
3205+ // Delete the member.
3206+ ['members ' , 'id_member ' ],
3207+ ['member_logins ' , 'id_member ' ],
3208+ ['user_alerts ' , 'id_member ' ],
3209+ ['user_alerts ' , 'id_member_started ' ],
3210+ ['user_alerts_prefs ' , 'id_member ' ],
3211+ // Delete any drafts...
3212+ ['user_drafts ' , 'id_member ' ],
3213+ // Delete anything they liked.
3214+ ['user_likes ' , 'id_member ' ],
3215+ // Delete their mentions
3216+ ['mentions ' , 'id_member ' ],
3217+ // Delete the logs...
3218+ ['log_actions ' , 'id_member ' , ' AND id_log = {int:log_type} ' , ['log_type ' => 2 ]],
3219+ ['log_boards ' , 'id_member ' ],
3220+ ['log_comments ' , 'id_recipient ' , ' AND comment_type = {string:warntpl} ' , ['warntpl ' => 'warntpl ' ]],
3221+ ['log_group_requests ' , 'id_member ' ],
3222+ ['log_mark_read ' , 'id_member ' ],
3223+ ['log_notify ' , 'id_member ' ],
3224+ ['log_online ' , 'id_member ' ],
3225+ ['log_subscribed ' , 'id_member ' ],
3226+ ['log_topics ' , 'id_member ' ],
3227+ ['personal_messages ' , 'id_member_from ' ],
3228+ ['pm_rules ' , 'id_member ' ],
3229+ // They no longer exist, so we don't know who it was sent to.
3230+ ['pm_recipients ' , 'id_member ' ],
3231+ // It's over, no more moderation for you.
3232+ ['moderators ' , 'id_member ' ],
3233+ ['group_moderators ' , 'id_member ' ],
3234+ // If you don't exist we can't ban you.
3235+ ['ban_items ' , 'id_member ' ],
3236+ // Remove individual theme settings.
3237+ ['themes ' , 'id_member ' ],
3238+ ];
33693239
3370- // Make their votes appear as guest votes - at least it keeps the totals right.
3371- // @todo Consider adding back in cookie protection.
3372- Db::$ db ->query (
3373- 'UPDATE {db_prefix}log_polls
3374- SET id_member = {int:guest_id}
3375- WHERE id_member IN ({array_int:users}) ' ,
3376- [
3377- 'guest_id ' => 0 ,
3378- 'users ' => $ users ,
3379- ],
3380- );
3240+ foreach ($ set_tables as $ d ) {
3241+ Db::$ db ->query (
3242+ 'UPDATE {db_prefix}{raw:table}
3243+ SET {raw:col} = {int:guest_id}
3244+ WHERE {raw:col} IN ({array_int:users}) ' ,
3245+ [
3246+ 'table ' => $ d [0 ],
3247+ 'col ' => $ d [1 ],
3248+ 'guest_id ' => 0 ,
3249+ 'users ' => $ users ,
3250+ ],
3251+ );
3252+ }
33813253
33823254 // Delete personal messages.
33833255 PM ::delete (null , null , $ users );
33843256
3385- Db::$ db ->query (
3386- 'UPDATE {db_prefix}personal_messages
3387- SET id_member_from = {int:guest_id}
3388- WHERE id_member_from IN ({array_int:users}) ' ,
3389- [
3390- 'guest_id ' => 0 ,
3391- 'users ' => $ users ,
3392- ],
3393- );
3394-
3395- // They no longer exist, so we don't know who it was sent to.
3396- Db::$ db ->query (
3397- 'DELETE FROM {db_prefix}pm_recipients
3398- WHERE id_member IN ({array_int:users}) ' ,
3399- [
3400- 'users ' => $ users ,
3401- ],
3402- );
3257+ foreach ($ delete_tables as $ d ) {
3258+ Db::$ db ->query (
3259+ 'DELETE FROM {db_prefix}{raw:table}
3260+ WHERE {raw:col} IN ({array_int:users}) ' . ($ d [2 ] ?? '' ),
3261+ array_merge ($ d [3 ] ?? [], [
3262+ 'table ' => $ d [0 ],
3263+ 'col ' => $ d [1 ],
3264+ 'users ' => $ users ,
3265+ ]),
3266+ );
3267+ }
34033268
34043269 // Delete avatar.
34053270 Attachment::remove (['id_member ' => $ users ]);
34063271
3407- // It's over, no more moderation for you.
3408- Db::$ db ->query (
3409- 'DELETE FROM {db_prefix}moderators
3410- WHERE id_member IN ({array_int:users}) ' ,
3411- [
3412- 'users ' => $ users ,
3413- ],
3414- );
3415-
3416- Db::$ db ->query (
3417- 'DELETE FROM {db_prefix}group_moderators
3418- WHERE id_member IN ({array_int:users}) ' ,
3419- [
3420- 'users ' => $ users ,
3421- ],
3422- );
3423-
3424- // If you don't exist we can't ban you.
3425- Db::$ db ->query (
3426- 'DELETE FROM {db_prefix}ban_items
3427- WHERE id_member IN ({array_int:users}) ' ,
3428- [
3429- 'users ' => $ users ,
3430- ],
3431- );
3432-
3433- // Remove individual theme settings.
3434- Db::$ db ->query (
3435- 'DELETE FROM {db_prefix}themes
3436- WHERE id_member IN ({array_int:users}) ' ,
3437- [
3438- 'users ' => $ users ,
3439- ],
3440- );
3441-
34423272 // These users are nobody's buddy nomore.
34433273 $ request = Db::$ db ->query (
34443274 'SELECT id_member, pm_ignore_list, buddy_list
@@ -3466,6 +3296,15 @@ public static function delete(int|array $users, bool $check_not_admin = false, b
34663296 }
34673297 Db::$ db ->free_result ($ request );
34683298
3299+ // Remove any emails we may have queued to send.
3300+ Db::$ db ->query (
3301+ 'DELETE FROM {db_prefix}mail_queue
3302+ WHERE recipient IN ({array_string:emails}) ' ,
3303+ [
3304+ 'emails ' => $ emails ,
3305+ ],
3306+ );
3307+
34693308 // Make sure no member's birthday is still sticking in the calendar...
34703309 Config::updateModSettings ([
34713310 'calendar_updated ' => time (),
0 commit comments