@@ -34,41 +34,45 @@ public BanHelper(
3434 _httpContext = httpContext ;
3535 }
3636
37- public IQueryable < BanJoin < ServerBan , ServerUnban > > CreateServerBanJoin ( )
37+ public IQueryable < BanJoin > CreateServerBanJoin ( )
3838 {
39- return CreateBanJoin < ServerBan , ServerUnban > ( _dbContext . Ban ) ;
39+ return CreateBanJoin ( ) . Where ( b => b . Ban . Type == BanType . Server ) ;
4040 }
4141
42- public IQueryable < BanJoin < ServerRoleBan , ServerRoleUnban > > CreateRoleBanJoin ( )
42+ public IQueryable < BanJoin > CreateRoleBanJoin ( )
4343 {
44- return CreateBanJoin < ServerRoleBan , ServerRoleUnban > ( _dbContext . RoleBan ) ;
44+ return CreateBanJoin ( ) . Where ( b => b . Ban . Type == BanType . Role ) ;
4545 }
4646
47- private IQueryable < BanJoin < TBan , TUnban > > CreateBanJoin < TBan , TUnban > ( DbSet < TBan > bans )
48- where TBan : class , IBanCommon < TUnban >
49- where TUnban : IUnbanCommon
47+ private IQueryable < BanJoin > CreateBanJoin ( )
5048 {
51- return bans
49+ return _dbContext . Ban
50+ . AsSplitQuery ( )
5251 . Include ( b => b . Unban )
52+ . Include ( b => b . Players )
53+ . Include ( b => b . Addresses )
54+ . Include ( b => b . Hwids )
55+ . Include ( b => b . Roles )
56+ . Include ( b => b . Rounds )
5357 . LeftJoin ( _dbContext . Player ,
54- ban => ban . PlayerUserId , player => player . UserId ,
55- ( ban , player ) => new { ban , player } )
56- . LeftJoin ( _dbContext . Player ,
57- ban => ban . ban . BanningAdmin , admin => admin . UserId ,
58- ( ban , admin ) => new { ban . ban , ban . player , admin } )
58+ ban => ban . BanningAdmin , admin => admin . UserId ,
59+ ( ban , admin ) => new { ban , admin } )
5960 . LeftJoin ( _dbContext . Player ,
6061 ban => ban . ban . Unban ! . UnbanningAdmin , unbanAdmin => unbanAdmin . UserId ,
61- ( ban , unbanAdmin ) => new BanJoin < TBan , TUnban >
62+ ( ban , unbanAdmin ) => new BanJoin
6263 {
64+ Players = ban . ban . Players !
65+ . Select ( p => _dbContext . Player . SingleOrDefault ( pp => p . UserId == pp . UserId ) )
66+ . Where ( p => p != null )
67+ . ToArray ( ) ! ,
6368 Ban = ban . ban ,
64- Player = ban . player ,
6569 Admin = ban . admin ,
6670 UnbanAdmin = unbanAdmin
6771 } ) ;
6872 }
6973
7074 [ Pure ]
71- public static bool IsBanActive < TUnban > ( IBanCommon < TUnban > b ) where TUnban : IUnbanCommon
75+ public static bool IsBanActive ( Ban b )
7276 {
7377 return ( b . ExpirationTime == null || b . ExpirationTime > DateTime . UtcNow ) && b . Unban == null ;
7478 }
@@ -80,11 +84,11 @@ public static bool IsBanActive<TUnban>(IBanCommon<TUnban> b) where TUnban : IUnb
8084 return hwid ? . ToString ( ) ;
8185 }
8286
83- public sealed class BanJoin < TBan , TUnban > where TBan : IBanCommon < TUnban > where TUnban : IUnbanCommon
87+ public sealed class BanJoin
8488 {
85- public TBan Ban { get ; set ; } = default ! ;
86- public Player ? Player { get ; set ; }
89+ public Ban Ban { get ; set ; } = default ! ;
8790 public Player ? Admin { get ; set ; }
91+ public Player [ ] Players { get ; set ; } = [ ] ;
8892 public Player ? UnbanAdmin { get ; set ; }
8993 }
9094
@@ -111,14 +115,13 @@ public sealed class BanJoin<TBan, TUnban> where TBan: IBanCommon<TUnban> where T
111115 }
112116
113117 /// <returns>Non-null string if an error occured that must be reported to the user.</returns>
114- public async Task < string ? > FillBanCommon < TUnban > (
115- IBanCommon < TUnban > ban ,
118+ public async Task < string ? > FillBanCommon (
119+ Ban ban ,
116120 string ? nameOrUid ,
117121 string ? ip ,
118122 string ? hwid ,
119123 int lengthMinutes ,
120124 string reason )
121- where TUnban : IUnbanCommon
122125 {
123126 if ( string . IsNullOrWhiteSpace ( nameOrUid ) && string . IsNullOrWhiteSpace ( ip ) && string . IsNullOrWhiteSpace ( hwid ) )
124127 return "Must provide at least one of name/UID, IP address or HWID." ;
@@ -128,9 +131,17 @@ public sealed class BanJoin<TBan, TUnban> where TBan: IBanCommon<TUnban> where T
128131
129132 if ( ! string . IsNullOrWhiteSpace ( nameOrUid ) )
130133 {
131- ban . PlayerUserId = await _playerLocator . Resolve ( nameOrUid ) ;
132- if ( ban . PlayerUserId == null )
134+ var userId = await _playerLocator . Resolve ( nameOrUid ) ;
135+ if ( userId == null )
133136 return $ "Unable to find user with name { nameOrUid } ";
137+
138+ ban . Players =
139+ [
140+ new BanPlayer
141+ {
142+ UserId = userId . Value ,
143+ }
144+ ] ;
134145 }
135146
136147 if ( ! string . IsNullOrWhiteSpace ( ip ) )
@@ -144,7 +155,13 @@ public sealed class BanJoin<TBan, TUnban> where TBan: IBanCommon<TUnban> where T
144155 // Ban /64 on IPv6.
145156 parsedCidr ??= ( byte ) ( parsedIp . AddressFamily == AddressFamily . InterNetwork ? 32 : 64 ) ;
146157
147- ban . Address = new NpgsqlInet ( parsedIp , parsedCidr . Value ) ;
158+ ban . Addresses =
159+ [
160+ new BanAddress
161+ {
162+ Address = new NpgsqlInet ( parsedIp , parsedCidr . Value )
163+ }
164+ ] ;
148165 }
149166
150167 if ( ! string . IsNullOrWhiteSpace ( hwid ) )
@@ -153,7 +170,13 @@ public sealed class BanJoin<TBan, TUnban> where TBan: IBanCommon<TUnban> where T
153170 if ( ! ImmutableTypedHwid . TryParse ( hwid , out var parsedHwid ) )
154171 return "Invalid HWID" ;
155172
156- ban . HWId = parsedHwid ;
173+ ban . Hwids =
174+ [
175+ new BanHwid
176+ {
177+ HWId = parsedHwid ,
178+ }
179+ ] ;
157180 }
158181
159182 if ( lengthMinutes != 0 )
0 commit comments