修复新人等级被降为零
This commit is contained in:
@@ -15,6 +15,9 @@ namespace App\Models;
|
|||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 类功能:读取和计算系统参数,提供等级经验阈值等全局配置能力。
|
||||||
|
*/
|
||||||
class Sysparam extends Model
|
class Sysparam extends Model
|
||||||
{
|
{
|
||||||
/** @var string 表名 */
|
/** @var string 表名 */
|
||||||
@@ -74,7 +77,8 @@ class Sysparam extends Model
|
|||||||
// 不超过最大等级
|
// 不超过最大等级
|
||||||
$maxLevel = (int) static::getValue('maxlevel', '99');
|
$maxLevel = (int) static::getValue('maxlevel', '99');
|
||||||
|
|
||||||
return min($level, $maxLevel);
|
// 聊天室普通用户最低等级为 1,避免低经验新人被自动存点降成 0 后无法进入默认房间。
|
||||||
|
return max(1, min($level, $maxLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -801,6 +801,39 @@ class ChatControllerTest extends TestCase
|
|||||||
$this->assertGreaterThanOrEqual(0, $user->exp_num); // Might be 1 depending on sysparam
|
$this->assertGreaterThanOrEqual(0, $user->exp_num); // Might be 1 depending on sysparam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试低经验新人心跳后不会被降到 0 级,刷新后仍可进入默认房间。
|
||||||
|
*/
|
||||||
|
public function test_low_exp_newbie_keeps_minimum_level_after_heartbeat(): void
|
||||||
|
{
|
||||||
|
Sysparam::updateOrCreate(['alias' => 'exp_per_heartbeat'], ['body' => '0']);
|
||||||
|
Sysparam::updateOrCreate(['alias' => 'jjb_per_heartbeat'], ['body' => '0']);
|
||||||
|
Sysparam::updateOrCreate(['alias' => 'auto_event_chance'], ['body' => '0']);
|
||||||
|
Cache::flush();
|
||||||
|
|
||||||
|
$room = Room::create([
|
||||||
|
'room_name' => 'newhb',
|
||||||
|
'permit_level' => 1,
|
||||||
|
'door_open' => true,
|
||||||
|
]);
|
||||||
|
$user = User::factory()->create([
|
||||||
|
'user_level' => 1,
|
||||||
|
'exp_num' => 0,
|
||||||
|
'has_received_new_gift' => true,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->actingAs($user)->get(route('chat.room', $room->id))->assertOk();
|
||||||
|
|
||||||
|
$heartbeatResponse = $this->actingAs($user)->postJson(route('chat.heartbeat', $room->id));
|
||||||
|
|
||||||
|
$heartbeatResponse->assertOk();
|
||||||
|
$heartbeatResponse->assertJsonPath('data.user_level', 1);
|
||||||
|
$this->assertSame(1, $user->fresh()->user_level);
|
||||||
|
|
||||||
|
Redis::del("room:{$room->id}:alive:{$user->username}");
|
||||||
|
$this->actingAs($user)->get(route('chat.room', $room->id))->assertOk();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 测试显式退房会清理 Redis 在线状态。
|
* 测试显式退房会清理 Redis 在线状态。
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user