diff --git a/app/Http/Controllers/Admin/AutoactController.php b/app/Http/Controllers/Admin/AutoactController.php new file mode 100644 index 0000000..142e035 --- /dev/null +++ b/app/Http/Controllers/Admin/AutoactController.php @@ -0,0 +1,97 @@ +get(); + + return view('admin.autoact.index', compact('events')); + } + + /** + * 保存新事件 + */ + public function store(Request $request): RedirectResponse + { + $data = $request->validate([ + 'text_body' => 'required|string|max:500', + 'event_type' => 'required|in:good,bad,neutral', + 'exp_change' => 'required|integer', + 'jjb_change' => 'required|integer', + ]); + + $data['enabled'] = true; + + Autoact::create($data); + + return redirect()->route('admin.autoact.index')->with('success', '事件添加成功!'); + } + + /** + * 更新事件 + */ + public function update(Request $request, int $id): RedirectResponse + { + $event = Autoact::findOrFail($id); + + $data = $request->validate([ + 'text_body' => 'required|string|max:500', + 'event_type' => 'required|in:good,bad,neutral', + 'exp_change' => 'required|integer', + 'jjb_change' => 'required|integer', + ]); + + $event->update($data); + + return redirect()->route('admin.autoact.index')->with('success', '事件修改成功!'); + } + + /** + * 切换事件启用/禁用状态 + */ + public function toggle(int $id): JsonResponse + { + $event = Autoact::findOrFail($id); + $event->enabled = ! $event->enabled; + $event->save(); + + return response()->json([ + 'status' => 'success', + 'enabled' => $event->enabled, + 'message' => $event->enabled ? '已启用' : '已禁用', + ]); + } + + /** + * 删除事件 + */ + public function destroy(int $id): RedirectResponse + { + Autoact::findOrFail($id)->delete(); + + return redirect()->route('admin.autoact.index')->with('success', '事件已删除!'); + } +} diff --git a/app/Http/Controllers/Admin/RoomManagerController.php b/app/Http/Controllers/Admin/RoomManagerController.php new file mode 100644 index 0000000..7d22b25 --- /dev/null +++ b/app/Http/Controllers/Admin/RoomManagerController.php @@ -0,0 +1,68 @@ +get(); + + return view('admin.rooms.index', compact('rooms')); + } + + /** + * 更新房间信息 + */ + public function update(Request $request, int $id): RedirectResponse + { + $room = Room::findOrFail($id); + + $data = $request->validate([ + 'room_name' => 'required|string|max:100', + 'room_des' => 'nullable|string|max:500', + 'announcement' => 'nullable|string|max:500', + 'room_owner' => 'nullable|string|max:50', + 'permit_level' => 'required|integer|min:0|max:15', + 'door_open' => 'required|boolean', + ]); + + $room->update($data); + + return redirect()->route('admin.rooms.index')->with('success', "房间 [{$room->room_name}] 信息已更新!"); + } + + /** + * 删除房间(非系统房间) + */ + public function destroy(int $id): RedirectResponse + { + $room = Room::findOrFail($id); + + if ($room->room_keep) { + return redirect()->route('admin.rooms.index')->with('error', '系统房间不允许删除!'); + } + + $room->delete(); + + return redirect()->route('admin.rooms.index')->with('success', "房间 [{$room->room_name}] 已删除!"); + } +} diff --git a/app/Http/Controllers/Admin/SqlController.php b/app/Http/Controllers/Admin/SqlController.php deleted file mode 100644 index c356e85..0000000 --- a/app/Http/Controllers/Admin/SqlController.php +++ /dev/null @@ -1,76 +0,0 @@ - null, 'query' => '', 'columns' => []]); - } - - /** - * 极度受限地执行 SQL (仅限 SELECT) - */ - public function execute(Request $request): View - { - $request->validate([ - 'query' => 'required|string|min:6', - ]); - - $sql = trim($request->input('query')); - - // 安全拦截:绝不允许含有 update/delete/insert/truncate/drop 等破坏性指令 - // 我们只允许查询,所以要求必须以 SELECT 起手,或者 EXPLAIN/SHOW - if (! preg_match('/^(SELECT|EXPLAIN|SHOW|DESCRIBE)\s/i', $sql)) { - return view('admin.sql.index', [ - 'results' => null, - 'columns' => [], - 'query' => $sql, - 'error' => '安全保护触发:本探针只允许执行 SELECT / SHOW 等只读查询!', - ]); - } - - try { - $results = DB::select($sql); - - // 提取表头 - $columns = []; - if (! empty($results)) { - $firstRow = (array) $results[0]; - $columns = array_keys($firstRow); - } - - return view('admin.sql.index', [ - 'results' => $results, - 'columns' => $columns, - 'query' => $sql, - 'error' => null, - ]); - } catch (\Exception $e) { - return view('admin.sql.index', [ - 'results' => null, - 'columns' => [], - 'query' => $sql, - 'error' => 'SQL 执行发生异常: '.$e->getMessage(), - ]); - } - } -} diff --git a/app/Http/Controllers/Admin/SystemController.php b/app/Http/Controllers/Admin/SystemController.php index 4e1d337..3e0388d 100644 --- a/app/Http/Controllers/Admin/SystemController.php +++ b/app/Http/Controllers/Admin/SystemController.php @@ -53,6 +53,9 @@ class SystemController extends Controller // 写入 Cache 保证极速读取 $this->chatState->setSysParam($alias, $body); + + // 同时清除 Sysparam 模型的内部缓存 + SysParam::clearCache($alias); } return redirect()->route('admin.system.edit')->with('success', '系统参数已成功更新并生效!'); diff --git a/app/Http/Controllers/Admin/UserManagerController.php b/app/Http/Controllers/Admin/UserManagerController.php index 9965f93..4e247e9 100644 --- a/app/Http/Controllers/Admin/UserManagerController.php +++ b/app/Http/Controllers/Admin/UserManagerController.php @@ -52,17 +52,23 @@ class UserManagerController extends Controller return response()->json(['status' => 'error', 'message' => '权限不足:您无法修改同级或高级管理人员资料。'], 403); } + // 管理员级别 = 最高等级 + 1,后台编辑最高可设到管理员级别 + $adminLevel = (int) \App\Models\Sysparam::getValue('maxlevel', '15') + 1; + $validated = $request->validate([ - 'sex' => 'sometimes|in:男,女,保密', - 'user_level' => 'sometimes|integer|min:0', + 'sex' => 'sometimes|integer|in:0,1,2', + 'user_level' => "sometimes|integer|min:0|max:{$adminLevel}", + 'exp_num' => 'sometimes|integer|min:0', + 'jjb' => 'sometimes|integer|min:0', + 'meili' => 'sometimes|integer|min:0', + 'qianming' => 'sometimes|nullable|string|max:255', 'headface' => 'sometimes|string|max:50', - 'sign' => 'sometimes|string|max:255', 'password' => 'nullable|string|min:6', ]); // 如果传了且没超权,直接赋予 if (isset($validated['user_level'])) { - // 不能把自己或别人提权到超过自己的等级 + // 不能把别人提权到超过自己的等级 if ($validated['user_level'] > $currentUser->user_level && $currentUser->id !== $targetUser->id) { return response()->json(['status' => 'error', 'message' => '您不能将别人提升至超过您的等级!'], 403); } @@ -72,12 +78,21 @@ class UserManagerController extends Controller if (isset($validated['sex'])) { $targetUser->sex = $validated['sex']; } + if (isset($validated['exp_num'])) { + $targetUser->exp_num = $validated['exp_num']; + } + if (isset($validated['jjb'])) { + $targetUser->jjb = $validated['jjb']; + } + if (isset($validated['meili'])) { + $targetUser->meili = $validated['meili']; + } + if (array_key_exists('qianming', $validated)) { + $targetUser->qianming = $validated['qianming']; + } if (isset($validated['headface'])) { $targetUser->headface = $validated['headface']; } - if (isset($validated['sign'])) { - $targetUser->sign = $validated['sign']; - } if (! empty($validated['password'])) { $targetUser->password = Hash::make($validated['password']); diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 9c54a6a..3a81057 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -70,7 +70,7 @@ class AuthController extends Controller 'last_ip' => $ip, 'user_level' => 1, // 默认普通用户等级 'sex' => 0, // 默认性别: 0保密 1男 2女 - // 如果原表里还有其他必填字段,在这里初始化默认值 + 'usersf' => '1.GIF', // 默认头像 ]); $this->performLogin($newUser, $ip); diff --git a/app/Http/Controllers/ChatController.php b/app/Http/Controllers/ChatController.php index 7172d6f..cdacda0 100644 --- a/app/Http/Controllers/ChatController.php +++ b/app/Http/Controllers/ChatController.php @@ -16,12 +16,15 @@ use App\Events\UserJoined; use App\Events\UserLeft; use App\Http\Requests\SendMessageRequest; use App\Jobs\SaveMessageJob; +use App\Models\Autoact; use App\Models\Room; +use App\Models\Sysparam; use App\Services\ChatStateService; use App\Services\MessageFilterService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Redis; use Illuminate\View\View; class ChatController extends Controller @@ -42,6 +45,9 @@ class ChatController extends Controller $room = Room::findOrFail($id); $user = Auth::user(); + // 房间人气 +1(每次访问递增,复刻原版人气计数) + $room->increment('visit_num'); + // 1. 将当前用户加入到 Redis 房间在线列表 $this->chatState->userJoin($id, $user->username, [ 'level' => $user->user_level, @@ -76,6 +82,18 @@ class ChatController extends Controller $data = $request->validated(); $user = Auth::user(); + // 0. 检查用户是否被禁言(Redis TTL 自动过期) + $muteKey = "mute:{$id}:{$user->username}"; + if (Redis::exists($muteKey)) { + $ttl = Redis::ttl($muteKey); + $minutes = ceil($ttl / 60); + + return response()->json([ + 'status' => 'error', + 'message' => "您正在禁言中,还需等待约 {$minutes} 分钟。", + ], 403); + } + // 1. 过滤净化消息体 $pureContent = $this->filter->filter($data['content'] ?? ''); if (empty($pureContent)) { @@ -104,6 +122,13 @@ class ChatController extends Controller // 5. 丢进异步列队,慢慢持久化到 MySQL,保护数据库连接池 SaveMessageJob::dispatch($messageData); + // 6. 如果用户更换了字体颜色,顺便保存到 s_color 字段,下次进入时恢复 + $chosenColor = $data['font_color'] ?? ''; + if ($chosenColor && $chosenColor !== ($user->s_color ?? '')) { + $user->s_color = $chosenColor; + $user->save(); + } + return response()->json(['status' => 'success']); } @@ -120,19 +145,22 @@ class ChatController extends Controller return response()->json(['status' => 'error'], 401); } - // 1. 每次心跳 +1 点经验 - $user->exp_num += 1; - - // 2. 检查等级计算:设定简单粗暴的平滑算式:需要经验=等级*等级*10 - // 例如:0级->0点;1级->10点;2级->40点;3级->90点;10级->1000点 - $currentLevel = $user->user_level; - $requiredExpForNextLevel = ($currentLevel) * ($currentLevel) * 10; + // 1. 每次心跳增加经验(可在 sysparam 后台配置) + $expGain = (int) Sysparam::getValue('exp_per_heartbeat', '1'); + $user->exp_num += $expGain; + // 2. 使用 sysparam 表中可配置的等级-经验阈值计算等级 + // 管理员(superlevel 及以上)不参与自动升降级,等级由后台手动设置 + $superLevel = (int) Sysparam::getValue('superlevel', '100'); + $oldLevel = $user->user_level; $leveledUp = false; - if ($user->exp_num >= $requiredExpForNextLevel) { - $user->user_level += 1; - $leveledUp = true; + if ($oldLevel < $superLevel) { + $newLevel = Sysparam::calculateLevel($user->exp_num); + if ($newLevel !== $oldLevel && $newLevel < $superLevel) { + $user->user_level = $newLevel; + $leveledUp = ($newLevel > $oldLevel); + } } $user->save(); // 存点入库 @@ -167,12 +195,61 @@ class ChatController extends Controller SaveMessageJob::dispatch($sysMsg); } + // 5. 随机事件触发(复刻原版 autoact 系统,概率可在后台配置) + $autoEvent = null; + $eventChance = (int) Sysparam::getValue('auto_event_chance', '10'); + if ($eventChance > 0 && rand(1, 100) <= $eventChance) { + $autoEvent = Autoact::randomEvent(); + if ($autoEvent) { + // 应用经验/金币变化(不低于 0) + if ($autoEvent->exp_change !== 0) { + $user->exp_num = max(0, $user->exp_num + $autoEvent->exp_change); + } + if ($autoEvent->jjb_change !== 0) { + $user->jjb = max(0, ($user->jjb ?? 0) + $autoEvent->jjb_change); + } + $user->save(); + + // 重新计算等级(经验可能因事件而变化,但管理员不参与自动升降级) + if ($user->user_level < $superLevel) { + $recalcLevel = Sysparam::calculateLevel($user->exp_num); + if ($recalcLevel !== $user->user_level && $recalcLevel < $superLevel) { + $user->user_level = $recalcLevel; + $user->save(); + } + } + + // 广播随机事件消息到聊天室 + $eventMsg = [ + 'id' => $this->chatState->nextMessageId($id), + 'room_id' => $id, + 'from_user' => '星海小博士', + 'to_user' => '大家', + 'content' => $autoEvent->renderText($user->username), + 'is_secret' => false, + 'font_color' => match ($autoEvent->event_type) { + 'good' => '#16a34a', // 绿色(好运) + 'bad' => '#dc2626', // 红色(坏运) + default => '#7c3aed', // 紫色(中性) + }, + 'action' => '', + 'sent_at' => now()->toDateTimeString(), + ]; + + $this->chatState->pushMessage($id, $eventMsg); + broadcast(new MessageSent($id, $eventMsg)); + SaveMessageJob::dispatch($eventMsg); + } + } + return response()->json([ 'status' => 'success', 'data' => [ 'exp_num' => $user->exp_num, 'user_level' => $user->user_level, 'leveled_up' => $leveledUp, + 'is_max_level' => $user->user_level >= $superLevel, + 'auto_event' => $autoEvent ? $autoEvent->renderText($user->username) : null, ], ]); } @@ -197,4 +274,105 @@ class ChatController extends Controller return response()->json(['status' => 'success']); } + + /** + * 获取可用头像列表(返回 JSON) + * 扫描 /public/images/headface/ 目录,返回所有可用头像文件名 + */ + public function headfaceList(): JsonResponse + { + $dir = public_path('images/headface'); + $files = []; + + if (is_dir($dir)) { + $all = scandir($dir); + foreach ($all as $file) { + // 只包含图片文件 + if (preg_match('/\.(gif|jpg|jpeg|png|bmp)$/i', $file)) { + $files[] = $file; + } + } + } + + // 自然排序(1, 2, 3... 10, 11...) + natsort($files); + + return response()->json(['headfaces' => array_values($files)]); + } + + /** + * 修改头像(原版 fw.asp 功能) + * 用户选择一个头像文件名,更新到 usersf 字段 + */ + public function changeAvatar(Request $request): JsonResponse + { + $user = auth()->user(); + $headface = $request->input('headface', ''); + + if (empty($headface)) { + return response()->json(['status' => 'error', 'message' => '请选择一个头像'], 422); + } + + // 验证文件确实存在 + if (! file_exists(public_path('images/headface/'.$headface))) { + return response()->json(['status' => 'error', 'message' => '头像文件不存在'], 422); + } + + // 更新用户头像 + $user->usersf = $headface; + $user->save(); + + return response()->json([ + 'status' => 'success', + 'message' => '头像修改成功!', + 'headface' => $headface, + ]); + } + + /** + * 设置房间公告/祝福语(滚动显示在聊天室顶部) + * 需要房间主人或等级达到 level_announcement 配置值 + * + * @param int $id 房间ID + */ + public function setAnnouncement(Request $request, int $id): JsonResponse + { + $user = Auth::user(); + $room = Room::findOrFail($id); + + // 权限检查:房间主人 或 等级 >= level_announcement + $requiredLevel = (int) Sysparam::getValue('level_announcement', '10'); + if ($user->username !== $room->master && $user->user_level < $requiredLevel) { + return response()->json(['status' => 'error', 'message' => '权限不足,无法修改公告'], 403); + } + + $request->validate([ + 'announcement' => 'required|string|max:500', + ]); + + $room->announcement = $request->input('announcement'); + $room->save(); + + // 广播公告更新到所有在线用户 + $sysMsg = [ + 'id' => $this->chatState->nextMessageId($id), + 'room_id' => $id, + 'from_user' => '系统公告', + 'to_user' => '大家', + 'content' => "📢 {$user->username} 更新了房间公告:{$room->announcement}", + 'is_secret' => false, + 'font_color' => '#cc0000', + 'action' => '', + 'sent_at' => now()->toDateTimeString(), + ]; + + $this->chatState->pushMessage($id, $sysMsg); + broadcast(new MessageSent($id, $sysMsg)); + + return response()->json([ + 'status' => 'success', + 'message' => '公告已更新!', + 'announcement' => $room->announcement, + ]); + } } diff --git a/app/Http/Controllers/FishingController.php b/app/Http/Controllers/FishingController.php new file mode 100644 index 0000000..d605387 --- /dev/null +++ b/app/Http/Controllers/FishingController.php @@ -0,0 +1,210 @@ +json(['status' => 'error', 'message' => '请先登录'], 401); + } + + // 1. 检查冷却时间(Redis TTL) + $cooldownKey = "fishing:cd:{$user->id}"; + if (Redis::exists($cooldownKey)) { + $ttl = Redis::ttl($cooldownKey); + + return response()->json([ + 'status' => 'error', + 'message' => "钓鱼冷却中,还需等待 {$ttl} 秒。", + 'cooldown' => $ttl, + ], 429); + } + + // 2. 检查金币是否足够 + $cost = (int) Sysparam::getValue('fishing_cost', '5'); + if (($user->jjb ?? 0) < $cost) { + return response()->json([ + 'status' => 'error', + 'message' => "金币不足!钓鱼需要 {$cost} 金币,您当前只有 {$user->jjb} 金币。", + ], 422); + } + + // 3. 扣除金币 + $user->jjb = max(0, ($user->jjb ?? 0) - $cost); + $user->save(); + + // 4. 设置"正在钓鱼"标记(防止重复抛竿,30秒后自动过期) + Redis::setex("fishing:active:{$user->id}", 30, time()); + + // 5. 计算随机等待时间 + $waitMin = (int) Sysparam::getValue('fishing_wait_min', '8'); + $waitMax = (int) Sysparam::getValue('fishing_wait_max', '15'); + $waitTime = rand($waitMin, $waitMax); + + return response()->json([ + 'status' => 'success', + 'message' => "已花费 {$cost} 金币,鱼竿已抛出!等待鱼儿上钩...", + 'wait_time' => $waitTime, + 'cost' => $cost, + 'jjb' => $user->jjb, + ]); + } + + /** + * 收竿 — 随机计算钓鱼结果,更新经验/金币,广播到聊天室 + * + * @param int $id 房间ID + */ + public function reel(Request $request, int $id): JsonResponse + { + $user = Auth::user(); + if (! $user) { + return response()->json(['status' => 'error', 'message' => '请先登录'], 401); + } + + // 1. 检查是否有"正在钓鱼"标记 + $activeKey = "fishing:active:{$user->id}"; + if (! Redis::exists($activeKey)) { + return response()->json([ + 'status' => 'error', + 'message' => '您还没有抛竿,或者鱼已经跑了!', + ], 422); + } + + // 清除钓鱼标记 + Redis::del($activeKey); + + // 2. 设置冷却时间 + $cooldown = (int) Sysparam::getValue('fishing_cooldown', '300'); + Redis::setex("fishing:cd:{$user->id}", $cooldown, time()); + + // 3. 随机决定钓鱼结果 + $result = $this->randomFishResult(); + + // 4. 更新用户经验和金币(不低于 0) + if ($result['exp'] !== 0) { + $user->exp_num = max(0, ($user->exp_num ?? 0) + $result['exp']); + } + if ($result['jjb'] !== 0) { + $user->jjb = max(0, ($user->jjb ?? 0) + $result['jjb']); + } + $user->save(); + + // 5. 广播钓鱼结果到聊天室 + $sysMsg = [ + 'id' => $this->chatState->nextMessageId($id), + 'room_id' => $id, + 'from_user' => '钓鱼播报', + 'to_user' => '大家', + 'content' => "{$result['emoji']} {$user->username}{$result['message']}", + 'is_secret' => false, + 'font_color' => $result['exp'] >= 0 ? '#16a34a' : '#dc2626', + 'action' => '', + 'sent_at' => now()->toDateTimeString(), + ]; + + $this->chatState->pushMessage($id, $sysMsg); + broadcast(new MessageSent($id, $sysMsg)); + + return response()->json([ + 'status' => 'success', + 'result' => $result, + 'exp_num' => $user->exp_num, + 'jjb' => $user->jjb, + ]); + } + + /** + * 随机钓鱼结果(复刻原版概率分布) + * + * @return array{emoji: string, message: string, exp: int, jjb: int} + */ + private function randomFishResult(): array + { + $roll = rand(1, 100); + + // 概率分布(总计 100%) + // 1-15: 大鲨鱼 (+100exp, +20金) + // 16-30: 娃娃鱼 (+0exp, +30金) + // 31-50: 大草鱼 (+50exp) + // 51-70: 小鲤鱼 (+50exp, +10金) + // 71-85: 落水 (-50exp) + // 86-95: 被打 (-20exp, -3金) + // 96-100:大丰收 (+150exp, +50金) + + return match (true) { + $roll <= 15 => [ + 'emoji' => '🦈', + 'message' => '钓到一条大鲨鱼!增加经验100、金币20', + 'exp' => 100, + 'jjb' => 20, + ], + $roll <= 30 => [ + 'emoji' => '🐟', + 'message' => '钓到一条娃娃鱼,到集市卖得30个金币', + 'exp' => 0, + 'jjb' => 30, + ], + $roll <= 50 => [ + 'emoji' => '🐠', + 'message' => '钓到一只大草鱼,吃下增加经验50', + 'exp' => 50, + 'jjb' => 0, + ], + $roll <= 70 => [ + 'emoji' => '🐡', + 'message' => '钓到一条小鲤鱼,增加经验50、金币10', + 'exp' => 50, + 'jjb' => 10, + ], + $roll <= 85 => [ + 'emoji' => '💧', + 'message' => '鱼没钓到,摔到河里经验减少50', + 'exp' => -50, + 'jjb' => 0, + ], + $roll <= 95 => [ + 'emoji' => '👊', + 'message' => '偷钓鱼塘被主人发现,一阵殴打!经验减少20、金币减少3', + 'exp' => -20, + 'jjb' => -3, + ], + default => [ + 'emoji' => '🎉', + 'message' => '运气爆棚!钓到大鲨鱼、大草鱼、小鲤鱼各一条!经验+150,金币+50!', + 'exp' => 150, + 'jjb' => 50, + ], + }; + } +} diff --git a/app/Http/Controllers/LeaderboardController.php b/app/Http/Controllers/LeaderboardController.php index 036e0e7..fc9de5c 100644 --- a/app/Http/Controllers/LeaderboardController.php +++ b/app/Http/Controllers/LeaderboardController.php @@ -28,7 +28,7 @@ class LeaderboardController extends Controller // 1. 境界榜 (以 user_level 为尊) $topLevels = Cache::remember('leaderboard:top_levels', $ttl, function () { - return User::select('id', 'username', 'headface', 'user_level', 'sex') + return User::select('id', 'username', 'usersf', 'user_level', 'sex') ->where('user_level', '>', 0) ->orderByDesc('user_level') ->orderBy('id') @@ -38,7 +38,7 @@ class LeaderboardController extends Controller // 2. 修为榜 (以 exp_num 为尊) $topExp = Cache::remember('leaderboard:top_exp', $ttl, function () { - return User::select('id', 'username', 'headface', 'exp_num', 'sex', 'user_level') + return User::select('id', 'username', 'usersf', 'exp_num', 'sex', 'user_level') ->where('exp_num', '>', 0) ->orderByDesc('exp_num') ->orderBy('id') @@ -48,7 +48,7 @@ class LeaderboardController extends Controller // 3. 财富榜 (以 jjb-交友币 为尊) $topWealth = Cache::remember('leaderboard:top_wealth', $ttl, function () { - return User::select('id', 'username', 'headface', 'jjb', 'sex', 'user_level') + return User::select('id', 'username', 'usersf', 'jjb', 'sex', 'user_level') ->where('jjb', '>', 0) ->orderByDesc('jjb') ->orderBy('id') @@ -58,7 +58,7 @@ class LeaderboardController extends Controller // 4. 魅力榜 (以 meili 为尊) $topCharm = Cache::remember('leaderboard:top_charm', $ttl, function () { - return User::select('id', 'username', 'headface', 'meili', 'sex', 'user_level') + return User::select('id', 'username', 'usersf', 'meili', 'sex', 'user_level') ->where('meili', '>', 0) ->orderByDesc('meili') ->orderBy('id') diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index b631c3c..8e0483f 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -2,11 +2,17 @@ /** * 文件功能:用户中心与管理控制器 - * 接管原版 USERinfo.ASP, USERSET.ASP, chpasswd.asp, KILLUSER.ASP + * 接管原版 USERinfo.ASP, USERSET.ASP, chpasswd.asp, KILLUSER.ASP, LOCKIP.ASP + * + * 权限等级通过 sysparam 表动态配置: + * level_kick - 踢人所需等级 + * level_mute - 禁言所需等级 + * level_ban - 封号所需等级 + * level_banip - 封IP所需等级 * * @author ChatRoom Laravel * - * @version 1.0.0 + * @version 1.1.0 */ namespace App\Http\Controllers; @@ -16,11 +22,13 @@ use App\Events\UserMuted; use App\Http\Requests\ChangePasswordRequest; use App\Http\Requests\UpdateProfileRequest; use App\Models\Room; +use App\Models\Sysparam; use App\Models\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Redis; class UserController extends Controller { @@ -36,7 +44,11 @@ class UserController extends Controller 'username' => $user->username, 'sex' => $user->sex, 'headface' => $user->headface, + 'usersf' => $user->usersf, 'user_level' => $user->user_level, + 'exp_num' => $user->exp_num ?? 0, + 'jjb' => $user->jjb ?? 0, + 'qianming' => $user->qianming, 'sign' => $user->sign ?? '这个人很懒,什么都没留下。', 'created_at' => $user->created_at->format('Y-m-d'), ]); @@ -85,7 +97,41 @@ class UserController extends Controller } /** - * 管理员/房主操作:踢出房间 (对应 KILLUSER.ASP) + * 通用权限校验:检查操作者是否有权操作目标用户 + * + * @param object $operator 操作者 + * @param string $targetUsername 目标用户名 + * @param int $roomId 房间ID + * @param string $levelKey sysparam中的等级键名(如 level_kick) + * @param string $actionName 操作名称(用于错误提示) + * @return array{room: Room, target: User}|JsonResponse + */ + private function checkPermission(object $operator, string $targetUsername, int $roomId, string $levelKey, string $actionName): array|JsonResponse + { + $room = Room::findOrFail($roomId); + $requiredLevel = (int) Sysparam::getValue($levelKey, '15'); + + // 鉴权:操作者要是房间房主或达到所需等级 + if ($room->master !== $operator->username && $operator->user_level < $requiredLevel) { + return response()->json(['status' => 'error', 'message' => "权限不足(需要{$requiredLevel}级),无法执行{$actionName}操作。"], 403); + } + + $targetUser = User::where('username', $targetUsername)->first(); + if (! $targetUser) { + return response()->json(['status' => 'error', 'message' => '目标用户不存在。'], 404); + } + + // 防误伤:不能操作等级 >= 自己的人 + if ($targetUser->user_level >= $operator->user_level) { + return response()->json(['status' => 'error', 'message' => "权限不足,无法对同级或高级用户执行{$actionName}。"], 403); + } + + return ['room' => $room, 'target' => $targetUser]; + } + + /** + * 踢出房间 (对应 KILLUSER.ASP) + * 所需等级由 sysparam level_kick 配置 */ public function kick(Request $request, string $username): JsonResponse { @@ -96,54 +142,113 @@ class UserController extends Controller return response()->json(['status' => 'error', 'message' => '缺少房间参数。'], 422); } - $room = Room::findOrFail($roomId); - - // 鉴权:操作者要是房间房主或者系统超管 - if ($room->master !== $operator->username && $operator->user_level < 15) { - return response()->json(['status' => 'error', 'message' => '权限不足,无法执行踢出操作。'], 403); + $result = $this->checkPermission($operator, $username, $roomId, 'level_kick', '踢出'); + if ($result instanceof JsonResponse) { + return $result; } - $targetUser = User::where('username', $username)->first(); - if (! $targetUser) { - return response()->json(['status' => 'error', 'message' => '目标用户不存在。'], 404); - } + // 广播踢出事件 + broadcast(new UserKicked($roomId, $result['target']->username, "管理员 [{$operator->username}] 将 [{$result['target']->username}] 踢出了聊天室。")); - // 防误伤高管 - if ($targetUser->user_level >= 15 && $operator->user_level < 15) { - return response()->json(['status' => 'error', 'message' => '权限不足,无法踢出同级或高级管理人员。'], 403); - } - - // 核心动作:向频道内所有人发送包含“某某踢出某某”的事件 - broadcast(new UserKicked($roomId, $targetUser->username, "管理员 [{$operator->username}] 将 [{$targetUser->username}] 踢出了聊天室。")); - - return response()->json(['status' => 'success', 'message' => "已成功将 {$targetUser->username} 踢出房间。"]); + return response()->json(['status' => 'success', 'message' => "已成功将 {$result['target']->username} 踢出房间。"]); } /** - * 管理员/具有道具者操作:禁言 (对应新加的限制功能) + * 禁言 (对应原版限制功能) + * 所需等级由 sysparam level_mute 配置 + * 禁言信息存入 Redis,TTL 到期自动解除 */ public function mute(Request $request, string $username): JsonResponse { $operator = Auth::user(); $roomId = $request->input('room_id'); - $duration = $request->input('duration', 5); // 默认封停分钟数 + $duration = (int) $request->input('duration', 5); if (! $roomId) { return response()->json(['status' => 'error', 'message' => '缺少房间参数。'], 422); } - $room = Room::findOrFail($roomId); - - // 此处只做简单鉴权演示,和踢人一致 - if ($room->master !== $operator->username && $operator->user_level < 15) { - return response()->json(['status' => 'error', 'message' => '权限不足,无法执行禁言操作。'], 403); + $result = $this->checkPermission($operator, $username, $roomId, 'level_mute', '禁言'); + if ($result instanceof JsonResponse) { + return $result; } - // 后续可以在 Redis 中写入一个 `mute:{$username}` 并附带 `TTL` 以在后台拦截 + // 写入 Redis 禁言标记,TTL = 禁言分钟数 * 60 + Redis::setex("mute:{$roomId}:{$username}", $duration * 60, json_encode([ + 'operator' => $operator->username, + 'reason' => '管理员禁言', + 'until' => now()->addMinutes($duration)->toDateTimeString(), + ])); - // 立刻向房间发送 Muted 事件 + // 广播禁言事件 broadcast(new UserMuted($roomId, $username, $duration)); - return response()->json(['status' => 'success', 'message' => "已对 {$username} 实施封口 {$duration} 分钟。"]); + return response()->json(['status' => 'success', 'message' => "已对 {$username} 实施禁言 {$duration} 分钟。"]); + } + + /** + * 封号(禁止登录) + * 所需等级由 sysparam level_ban 配置 + * 将用户等级设为 -1 表示封禁 + */ + public function ban(Request $request, string $username): JsonResponse + { + $operator = Auth::user(); + $roomId = $request->input('room_id'); + + if (! $roomId) { + return response()->json(['status' => 'error', 'message' => '缺少房间参数。'], 422); + } + + $result = $this->checkPermission($operator, $username, $roomId, 'level_ban', '封号'); + if ($result instanceof JsonResponse) { + return $result; + } + + // 封号:设置等级为 -1 + $result['target']->user_level = -1; + $result['target']->save(); + + // 踢出聊天室 + broadcast(new UserKicked($roomId, $username, "管理员 [{$operator->username}] 已封禁用户 [{$username}] 的账号。")); + + return response()->json(['status' => 'success', 'message' => "用户 {$username} 已被封号。"]); + } + + /** + * 封IP(记录IP到黑名单并踢出) + * 所需等级由 sysparam level_banip 配置 + */ + public function banIp(Request $request, string $username): JsonResponse + { + $operator = Auth::user(); + $roomId = $request->input('room_id'); + + if (! $roomId) { + return response()->json(['status' => 'error', 'message' => '缺少房间参数。'], 422); + } + + $result = $this->checkPermission($operator, $username, $roomId, 'level_banip', '封IP'); + if ($result instanceof JsonResponse) { + return $result; + } + + $targetIp = $result['target']->last_ip; + + if ($targetIp) { + // 将IP加入 Redis 黑名单(永久) + Redis::sadd('banned_ips', $targetIp); + } + + // 同时封号 + $result['target']->user_level = -1; + $result['target']->save(); + + // 踢出聊天室 + broadcast(new UserKicked($roomId, $username, "管理员 [{$operator->username}] 已封禁用户 [{$username}] 的IP地址。")); + + $ipInfo = $targetIp ? "(IP: {$targetIp})" : '(未记录IP)'; + + return response()->json(['status' => 'success', 'message' => "用户 {$username} 已被封号并封IP{$ipInfo}。"]); } } diff --git a/app/Http/Middleware/LevelRequired.php b/app/Http/Middleware/LevelRequired.php index fe2f6e3..02cfb0b 100644 --- a/app/Http/Middleware/LevelRequired.php +++ b/app/Http/Middleware/LevelRequired.php @@ -2,6 +2,7 @@ /** * 文件功能:用户等级权限验证中间件 + * 支持传入固定数字等级 或 'super' 关键字(动态读取 sysparam 的 superlevel) * * @author ChatRoom Laravel * @@ -10,6 +11,7 @@ namespace App\Http\Middleware; +use App\Models\Sysparam; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -18,21 +20,26 @@ use Symfony\Component\HttpFoundation\Response; class LevelRequired { /** - * Handle an incoming request. * 校验当前登录用户的等级是否大于或等于要求等级。 + * 当 $level 为 'super' 时,动态从 sysparam 表读取 superlevel 值。 * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next - * @param int $level 要求达到的最低等级 (例如 15 为室主) + * @param string $level 要求的最低等级(数字 或 'super') */ - public function handle(Request $request, Closure $next, int $level): Response + public function handle(Request $request, Closure $next, string $level = 'super'): Response { if (! Auth::check()) { return redirect()->route('home'); } + // 动态解析等级要求:'super' → 从 sysparam 读取,数字 → 直接使用 + $requiredLevel = ($level === 'super') + ? (int) Sysparam::getValue('superlevel', '100') + : (int) $level; + $user = Auth::user(); - if ($user->user_level < $level) { + if ($user->user_level < $requiredLevel) { if ($request->expectsJson()) { return response()->json(['message' => '权限不足', 'status' => 'error'], 403); } diff --git a/app/Http/Requests/LoginRequest.php b/app/Http/Requests/LoginRequest.php index a625d96..462b9df 100644 --- a/app/Http/Requests/LoginRequest.php +++ b/app/Http/Requests/LoginRequest.php @@ -39,8 +39,7 @@ class LoginRequest extends FormRequest 'regex:/^[^<>\'"]+$/u', ], 'password' => ['required', 'string', 'min:1'], - // 'captcha' => ['required', 'captcha'], - 'captcha' => ['nullable'], // 【本地调试临时绕过验证码强校验,跳过session丢失问题】 + 'captcha' => ['required', 'captcha'], ]; } diff --git a/app/Models/Autoact.php b/app/Models/Autoact.php new file mode 100644 index 0000000..3467a8f --- /dev/null +++ b/app/Models/Autoact.php @@ -0,0 +1,57 @@ + 'integer', + 'jjb_change' => 'integer', + 'enabled' => 'boolean', + ]; + + /** + * 随机获取一条已启用的事件 + */ + public static function randomEvent(): ?self + { + return static::where('enabled', true)->inRandomOrder()->first(); + } + + /** + * 将事件文本中的变量替换为实际值 + * + * @param string $username 当前用户名 + * @return string 替换后的文本 + */ + public function renderText(string $username): string + { + return str_replace('{username}', $username, $this->text_body); + } +} diff --git a/app/Models/Room.php b/app/Models/Room.php index 3197551..df750ff 100644 --- a/app/Models/Room.php +++ b/app/Models/Room.php @@ -36,6 +36,7 @@ class Room extends Model 'build_time', 'permit_level', 'door_open', + 'announcement', ]; /** diff --git a/app/Models/SysParam.php b/app/Models/SysParam.php index 0e91693..467655d 100644 --- a/app/Models/SysParam.php +++ b/app/Models/SysParam.php @@ -2,28 +2,89 @@ /** * 文件功能:系统参数模型 + * 对应原版 ASP 聊天室的 sysparam 配置表 + * 管理员可在后台修改等级经验阈值等系统参数 * - * 对应原 ASP 文件:sysparam 表 - * - * @author ChatRoom Laravel - * - * @version 1.0.0 + * @package App\Models + * @author ChatRoom Laravel + * @version 1.0.0 */ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\Cache; -class SysParam extends Model +class Sysparam extends Model { + /** @var string 表名 */ + protected $table = 'sysparam'; + + /** @var array 可批量赋值的字段 */ + protected $fillable = ['alias', 'body', 'guidetxt']; + /** - * The attributes that are mass assignable. + * 获取指定参数的值 + * 带缓存,避免频繁查库 * - * @var array + * @param string $alias 参数别名 + * @param string $default 默认值 + * @return string */ - protected $fillable = [ - 'alias', - 'guidetxt', - 'body', - ]; + public static function getValue(string $alias, string $default = ''): string + { + return Cache::remember("sysparam:{$alias}", 300, function () use ($alias, $default) { + $param = static::where('alias', $alias)->first(); + + return $param ? ($param->body ?? $default) : $default; + }); + } + + /** + * 获取等级经验阈值数组 + * 返回格式:[0 => 10, 1 => 50, 2 => 150, ...] 索引即为目标等级-1 + * + * @return array + */ + public static function getLevelExpThresholds(): array + { + $str = static::getValue('levelexp', '10,50,150,400,800,1500,3000,5000,8000,12000,18000,25000,35000,50000,80000'); + + return array_map('intval', explode(',', $str)); + } + + /** + * 根据经验值计算应该达到的等级 + * + * @param int $expNum 当前经验值 + * @return int 对应的等级 + */ + public static function calculateLevel(int $expNum): int + { + $thresholds = static::getLevelExpThresholds(); + $level = 0; + + foreach ($thresholds as $threshold) { + if ($expNum >= $threshold) { + $level++; + } else { + break; + } + } + + // 不超过最大等级 + $maxLevel = (int) static::getValue('maxlevel', '99'); + + return min($level, $maxLevel); + } + + /** + * 清除指定参数的缓存 + * + * @param string $alias 参数别名 + */ + public static function clearCache(string $alias): void + { + Cache::forget("sysparam:{$alias}"); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 95630ab..405530a 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -12,6 +12,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -34,6 +35,7 @@ class User extends Authenticatable 'room_id', 'first_ip', 'last_ip', + 'usersf', ]; /** @@ -69,4 +71,18 @@ class User extends Authenticatable 'q3_time' => 'datetime', ]; } + + /** + * 头像文件名访问器 + * + * 原 ASP 系统的头像文件名存储在 usersf 字段中(如 "75.GIF"), + * 但项目中各处通过 $user->headface 来引用头像。 + * 此 accessor 将 headface 属性映射到 usersf 字段,保持代码一致性。 + */ + protected function headface(): Attribute + { + return Attribute::make( + get: fn () => $this->usersf ?: '1.GIF', + ); + } } diff --git a/assets/backgrounds/01.png b/assets/backgrounds/01.png new file mode 100644 index 0000000..3f9c5fd Binary files /dev/null and b/assets/backgrounds/01.png differ diff --git a/assets/backgrounds/02.png b/assets/backgrounds/02.png new file mode 100644 index 0000000..839bd8f Binary files /dev/null and b/assets/backgrounds/02.png differ diff --git a/assets/backgrounds/03.png b/assets/backgrounds/03.png new file mode 100644 index 0000000..6c5291f Binary files /dev/null and b/assets/backgrounds/03.png differ diff --git a/assets/backgrounds/04.png b/assets/backgrounds/04.png new file mode 100644 index 0000000..e8dceec Binary files /dev/null and b/assets/backgrounds/04.png differ diff --git a/assets/backgrounds/05.png b/assets/backgrounds/05.png new file mode 100644 index 0000000..9c38247 Binary files /dev/null and b/assets/backgrounds/05.png differ diff --git a/assets/backgrounds/06.png b/assets/backgrounds/06.png new file mode 100644 index 0000000..6d2f02c Binary files /dev/null and b/assets/backgrounds/06.png differ diff --git a/assets/backgrounds/07.png b/assets/backgrounds/07.png new file mode 100644 index 0000000..056ea50 Binary files /dev/null and b/assets/backgrounds/07.png differ diff --git a/assets/backgrounds/08.png b/assets/backgrounds/08.png new file mode 100644 index 0000000..7e5fcc4 Binary files /dev/null and b/assets/backgrounds/08.png differ diff --git a/assets/backgrounds/09.png b/assets/backgrounds/09.png new file mode 100644 index 0000000..febfca1 Binary files /dev/null and b/assets/backgrounds/09.png differ diff --git a/assets/backgrounds/10.png b/assets/backgrounds/10.png new file mode 100644 index 0000000..5571921 Binary files /dev/null and b/assets/backgrounds/10.png differ diff --git a/assets/backgrounds/11.png b/assets/backgrounds/11.png new file mode 100644 index 0000000..c6e1faf Binary files /dev/null and b/assets/backgrounds/11.png differ diff --git a/assets/backgrounds/12.png b/assets/backgrounds/12.png new file mode 100644 index 0000000..439964e Binary files /dev/null and b/assets/backgrounds/12.png differ diff --git a/assets/fonts/ABeeZee_regular.ttf b/assets/fonts/ABeeZee_regular.ttf new file mode 100644 index 0000000..9eae6f2 Binary files /dev/null and b/assets/fonts/ABeeZee_regular.ttf differ diff --git a/assets/fonts/Asap_700.ttf b/assets/fonts/Asap_700.ttf new file mode 100644 index 0000000..6386c6b Binary files /dev/null and b/assets/fonts/Asap_700.ttf differ diff --git a/assets/fonts/Khand_500.ttf b/assets/fonts/Khand_500.ttf new file mode 100644 index 0000000..678a491 Binary files /dev/null and b/assets/fonts/Khand_500.ttf differ diff --git a/assets/fonts/Open_Sans_regular.ttf b/assets/fonts/Open_Sans_regular.ttf new file mode 100644 index 0000000..db43334 Binary files /dev/null and b/assets/fonts/Open_Sans_regular.ttf differ diff --git a/assets/fonts/Roboto_regular.ttf b/assets/fonts/Roboto_regular.ttf new file mode 100644 index 0000000..8c082c8 Binary files /dev/null and b/assets/fonts/Roboto_regular.ttf differ diff --git a/assets/fonts/Ubuntu_regular.ttf b/assets/fonts/Ubuntu_regular.ttf new file mode 100644 index 0000000..45a038b Binary files /dev/null and b/assets/fonts/Ubuntu_regular.ttf differ diff --git a/assets/fonts/license/LICENSE-2.0.txt b/assets/fonts/license/LICENSE-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/assets/fonts/license/LICENSE-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/assets/fonts/license/OFL.txt b/assets/fonts/license/OFL.txt new file mode 100644 index 0000000..801ca38 --- /dev/null +++ b/assets/fonts/license/OFL.txt @@ -0,0 +1 @@ +Copyright (c) , (), with Reserved Font Name . Copyright (c) , (), with Reserved Font Name . Copyright (c) , (). This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/assets/fonts/license/ubuntu-font-licence-1.0.txt b/assets/fonts/license/ubuntu-font-licence-1.0.txt new file mode 100644 index 0000000..ae78a8f --- /dev/null +++ b/assets/fonts/license/ubuntu-font-licence-1.0.txt @@ -0,0 +1,96 @@ +------------------------------- +UBUNTU FONT LICENCE Version 1.0 +------------------------------- + +PREAMBLE +This licence allows the licensed fonts to be used, studied, modified and +redistributed freely. The fonts, including any derivative works, can be +bundled, embedded, and redistributed provided the terms of this licence +are met. The fonts and derivatives, however, cannot be released under +any other licence. The requirement for fonts to remain under this +licence does not require any document created using the fonts or their +derivatives to be published under this licence, as long as the primary +purpose of the document is not to be a vehicle for the distribution of +the fonts. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this licence and clearly marked as such. This may +include source files, build scripts and documentation. + +"Original Version" refers to the collection of Font Software components +as received under this licence. + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to +a new environment. + +"Copyright Holder(s)" refers to all individuals and companies who have a +copyright ownership of the Font Software. + +"Substantially Changed" refers to Modified Versions which can be easily +identified as dissimilar to the Font Software by users of the Font +Software comparing the Original Version with the Modified Version. + +To "Propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification and with or without charging +a redistribution fee), making available to the public, and in some +countries other activities as well. + +PERMISSION & CONDITIONS +This licence does not grant any rights under trademark law and all such +rights are reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of the Font Software, to propagate the Font Software, subject to +the below conditions: + +1) Each copy of the Font Software must contain the above copyright +notice and this licence. These can be included either as stand-alone +text files, human-readable headers or in the appropriate machine- +readable metadata fields within text or binary files as long as those +fields can be easily viewed by the user. + +2) The font name complies with the following: +(a) The Original Version must retain its name, unmodified. +(b) Modified Versions which are Substantially Changed must be renamed to +avoid use of the name of the Original Version or similar names entirely. +(c) Modified Versions which are not Substantially Changed must be +renamed to both (i) retain the name of the Original Version and (ii) add +additional naming elements to distinguish the Modified Version from the +Original Version. The name of such Modified Versions must be the name of +the Original Version, with "derivative X" where X represents the name of +the new work, appended to that name. + +3) The name(s) of the Copyright Holder(s) and any contributor to the +Font Software shall not be used to promote, endorse or advertise any +Modified Version, except (i) as required by this licence, (ii) to +acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with +their explicit written permission. + +4) The Font Software, modified or unmodified, in part or in whole, must +be distributed entirely under this licence, and must not be distributed +under any other licence. The requirement for fonts to remain under this +licence does not affect any document created using the Font Software, +except any version of the Font Software extracted from a document +created using the Font Software may only be distributed under this +licence. + +TERMINATION +This licence becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +DEALINGS IN THE FONT SOFTWARE. diff --git a/config/captcha.php b/config/captcha.php index b875973..382ca6f 100644 --- a/config/captcha.php +++ b/config/captcha.php @@ -2,20 +2,20 @@ return [ 'disable' => env('CAPTCHA_DISABLE', false), - 'characters' => ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', - 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', - 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + 'characters' => [2, 3, 4, 5, 6, 7, 8, 9], 'fontsDirectory' => dirname(__DIR__).'/assets/fonts', 'bgsDirectory' => dirname(__DIR__).'/assets/backgrounds', 'default' => [ - 'length' => 6, - 'width' => 345, - 'height' => 65, + 'length' => 4, + 'width' => 120, + 'height' => 36, 'quality' => 90, 'math' => false, 'expire' => 60, 'encrypt' => false, + 'lines' => 2, + 'bgImage' => false, + 'bgColor' => '#ffffff', ], 'flat' => [ 'length' => 6, diff --git a/database/migrations/2026_02_26_091905_add_visit_num_to_rooms_table.php b/database/migrations/2026_02_26_091905_add_visit_num_to_rooms_table.php new file mode 100644 index 0000000..f95164f --- /dev/null +++ b/database/migrations/2026_02_26_091905_add_visit_num_to_rooms_table.php @@ -0,0 +1,34 @@ +unsignedBigInteger('visit_num')->default(0)->after('ooooo') + ->comment('房间人气(总访问人次)'); + }); + } + + /** + * 回滚:移除 visit_num 字段 + */ + public function down(): void + { + Schema::table('rooms', function (Blueprint $table) { + $table->dropColumn('visit_num'); + }); + } +}; diff --git a/database/migrations/2026_02_26_092923_create_sysparam_table.php b/database/migrations/2026_02_26_092923_create_sysparam_table.php new file mode 100644 index 0000000..c798b2b --- /dev/null +++ b/database/migrations/2026_02_26_092923_create_sysparam_table.php @@ -0,0 +1,71 @@ +id(); + $table->string('alias', 100)->unique()->comment('参数别名(唯一标识)'); + $table->text('body')->nullable()->comment('参数值'); + $table->string('guidetxt', 500)->nullable()->comment('参数说明(后台显示)'); + $table->timestamps(); + }); + + // 插入默认的等级经验配置(管理员可在后台修改) + // 格式:逗号分隔,每项为"等级所需的累计经验值" + // 例如:等级1需要10经验,等级2需要50,等级3需要150... + DB::table('sysparam')->insert([ + [ + 'alias' => 'levelexp', + 'body' => '10,50,150,400,800,1500,3000,5000,8000,12000,18000,25000,35000,50000,80000', + 'guidetxt' => '等级经验阈值配置(逗号分隔)。第N个数字表示升到N级所需的累计经验值。例如:10,50,150 表示1级需10经验,2级需50经验,3级需150经验。', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'alias' => 'exp_per_heartbeat', + 'body' => '1', + 'guidetxt' => '每次心跳(约60秒)增加的经验值', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'alias' => 'superlevel', + 'body' => '16', + 'guidetxt' => '管理员级别(= 最高等级 + 1,拥有最高权限的等级阈值)', + 'created_at' => now(), + 'updated_at' => now(), + ], + [ + 'alias' => 'maxlevel', + 'body' => '15', + 'guidetxt' => '用户最高可达等级', + 'created_at' => now(), + 'updated_at' => now(), + ], + ]); + } + + /** + * 回滚:删除 sysparam 表 + */ + public function down(): void + { + Schema::dropIfExists('sysparam'); + } +}; diff --git a/database/migrations/2026_02_26_094113_create_autoact_table.php b/database/migrations/2026_02_26_094113_create_autoact_table.php new file mode 100644 index 0000000..78df96e --- /dev/null +++ b/database/migrations/2026_02_26_094113_create_autoact_table.php @@ -0,0 +1,73 @@ +id(); + $table->string('text_body', 500)->comment('事件文本内容(支持变量替换)'); + $table->string('event_type', 20)->default('neutral')->comment('事件类型:good=好运, bad=坏运, neutral=中性'); + $table->integer('exp_change')->default(0)->comment('经验变化值(正=奖励, 负=惩罚)'); + $table->integer('jjb_change')->default(0)->comment('金币变化值(正=奖励, 负=惩罚)'); + $table->boolean('enabled')->default(true)->comment('是否启用'); + $table->timestamps(); + }); + + // 插入默认随机事件 + $events = [ + // 好运事件(奖励经验/金币) + ['text_body' => '🎉 恭喜【{username}】路遇仙人指点,获得 100 经验值!', 'event_type' => 'good', 'exp_change' => 100, 'jjb_change' => 0], + ['text_body' => '💰 【{username}】在路边捡到一袋金币,获得 500 金币!', 'event_type' => 'good', 'exp_change' => 0, 'jjb_change' => 500], + ['text_body' => '🌟 天降祥瑞!【{username}】获得 200 经验 + 200 金币!', 'event_type' => 'good', 'exp_change' => 200, 'jjb_change' => 200], + ['text_body' => '🎊 【{username}】参加武林大会获胜,奖励 300 经验!', 'event_type' => 'good', 'exp_change' => 300, 'jjb_change' => 0], + ['text_body' => '🏆 【{username}】完成了一个神秘任务,获得 150 金币!', 'event_type' => 'good', 'exp_change' => 0, 'jjb_change' => 150], + ['text_body' => '✨ 【{username}】领悟了一招绝学,经验暴增 500!', 'event_type' => 'good', 'exp_change' => 500, 'jjb_change' => 0], + ['text_body' => '🎁 系统随机赠送【{username}】100 金币,请查收!', 'event_type' => 'good', 'exp_change' => 0, 'jjb_change' => 100], + + // 坏运事件(扣除经验/金币) + ['text_body' => '💀 【{username}】不小心踩到陷阱,损失 50 经验!', 'event_type' => 'bad', 'exp_change' => -50, 'jjb_change' => 0], + ['text_body' => '😱 【{username}】遭遇山贼打劫,被抢走 100 金币!', 'event_type' => 'bad', 'exp_change' => 0, 'jjb_change' => -100], + ['text_body' => '🌧️ 【{username}】在雨中迷路,消耗 80 经验值。', 'event_type' => 'bad', 'exp_change' => -80, 'jjb_change' => 0], + ['text_body' => '🐍 【{username}】被毒蛇咬了一口,损失 30 经验和 50 金币!', 'event_type' => 'bad', 'exp_change' => -30, 'jjb_change' => -50], + + // 中性事件(纯文字,不奖惩) + ['text_body' => '🔮 星海小博士:【{username}】今天运势不错,继续加油!', 'event_type' => 'neutral', 'exp_change' => 0, 'jjb_change' => 0], + ['text_body' => '📜 星海小博士:有人说"坚持就是胜利",【{username}】觉得呢?', 'event_type' => 'neutral', 'exp_change' => 0, 'jjb_change' => 0], + ['text_body' => '🌈 星海小博士:【{username}】今天心情如何?记得多喝水哦!', 'event_type' => 'neutral', 'exp_change' => 0, 'jjb_change' => 0], + ['text_body' => '🎵 星海小博士:送给【{username}】一首歌,祝你天天开心!', 'event_type' => 'neutral', 'exp_change' => 0, 'jjb_change' => 0], + ]; + + $now = now(); + foreach ($events as &$event) { + $event['enabled'] = true; + $event['created_at'] = $now; + $event['updated_at'] = $now; + } + + DB::table('autoact')->insert($events); + } + + /** + * 回滚:删除 autoact 表 + */ + public function down(): void + { + Schema::dropIfExists('autoact'); + } +}; diff --git a/database/migrations/2026_02_26_095610_add_announcement_to_rooms_table.php b/database/migrations/2026_02_26_095610_add_announcement_to_rooms_table.php new file mode 100644 index 0000000..b2bcbc4 --- /dev/null +++ b/database/migrations/2026_02_26_095610_add_announcement_to_rooms_table.php @@ -0,0 +1,33 @@ +string('announcement', 500)->nullable()->after('room_des')->comment('房间公告/祝福语(滚动显示)'); + }); + } + + /** + * 回滚 + */ + public function down(): void + { + Schema::table('rooms', function (Blueprint $table) { + $table->dropColumn('announcement'); + }); + } +}; diff --git a/database/migrations/2026_02_26_123935_change_s_color_to_string_in_users_table.php b/database/migrations/2026_02_26_123935_change_s_color_to_string_in_users_table.php new file mode 100644 index 0000000..bba9a14 --- /dev/null +++ b/database/migrations/2026_02_26_123935_change_s_color_to_string_in_users_table.php @@ -0,0 +1,33 @@ +string('s_color', 10)->nullable()->comment('发言颜色(hex,如 #ff0000)')->change(); + }); + } + + /** + * 回滚:s_color 从 varchar 改回 integer + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->integer('s_color')->nullable()->comment('发言颜色')->change(); + }); + } +}; diff --git a/database/migrations/2026_02_26_124547_add_missing_sysparam_records.php b/database/migrations/2026_02_26_124547_add_missing_sysparam_records.php new file mode 100644 index 0000000..5e197dc --- /dev/null +++ b/database/migrations/2026_02_26_124547_add_missing_sysparam_records.php @@ -0,0 +1,81 @@ +insertOrIgnore([ + [ + 'alias' => 'level_kick', + 'body' => '10', + 'guidetxt' => '踢人所需等级(管理员可在聊天室踢出用户的最低等级)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'level_mute', + 'body' => '8', + 'guidetxt' => '禁言所需等级(管理员可在聊天室禁言用户的最低等级)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'level_ban', + 'body' => '12', + 'guidetxt' => '封号所需等级(管理员可封禁用户账号的最低等级)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'level_banip', + 'body' => '14', + 'guidetxt' => '封IP所需等级(管理员可封禁用户IP地址的最低等级)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'level_announcement', + 'body' => '10', + 'guidetxt' => '设置公告所需等级(可修改房间公告/祝福语的最低等级)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'auto_event_chance', + 'body' => '10', + 'guidetxt' => '随机事件触发概率(百分比,1-100,每次心跳时按此概率触发随机事件)', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * 回滚:删除补充的参数记录 + */ + public function down(): void + { + DB::table('sysparam')->whereIn('alias', [ + 'level_kick', + 'level_mute', + 'level_ban', + 'level_banip', + 'level_announcement', + 'auto_event_chance', + ])->delete(); + } +}; diff --git a/database/migrations/2026_02_26_124729_update_level_system_to_99.php b/database/migrations/2026_02_26_124729_update_level_system_to_99.php new file mode 100644 index 0000000..0ca3dde --- /dev/null +++ b/database/migrations/2026_02_26_124729_update_level_system_to_99.php @@ -0,0 +1,95 @@ +where('alias', 'maxlevel') + ->update(['body' => '99', 'guidetxt' => '用户最高可达等级', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'superlevel') + ->update(['body' => '100', 'guidetxt' => '管理员级别(= 最高等级 + 1,拥有最高权限的等级阈值)', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'levelexp') + ->update(['body' => $levelExpStr, 'updated_at' => $now]); + + // 按比例调整管理权限等级(原体系 /15,新体系 /99) + // 禁言:8/15 ≈ 53% → 50级 + DB::table('sysparam')->where('alias', 'level_mute') + ->update(['body' => '50', 'updated_at' => $now]); + + // 踢人:10/15 ≈ 67% → 60级 + DB::table('sysparam')->where('alias', 'level_kick') + ->update(['body' => '60', 'updated_at' => $now]); + + // 设公告:10/15 ≈ 67% → 60级 + DB::table('sysparam')->where('alias', 'level_announcement') + ->update(['body' => '60', 'updated_at' => $now]); + + // 封号:12/15 = 80% → 80级 + DB::table('sysparam')->where('alias', 'level_ban') + ->update(['body' => '80', 'updated_at' => $now]); + + // 封IP:14/15 ≈ 93% → 90级 + DB::table('sysparam')->where('alias', 'level_banip') + ->update(['body' => '90', 'updated_at' => $now]); + } + + /** + * 回滚:恢复到原始 15 级体系 + */ + public function down(): void + { + $now = now(); + + DB::table('sysparam')->where('alias', 'maxlevel') + ->update(['body' => '15', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'superlevel') + ->update(['body' => '16', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'levelexp') + ->update(['body' => '10,50,150,400,800,1500,3000,5000,8000,12000,18000,25000,35000,50000,80000', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'level_mute') + ->update(['body' => '8', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'level_kick') + ->update(['body' => '10', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'level_announcement') + ->update(['body' => '10', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'level_ban') + ->update(['body' => '12', 'updated_at' => $now]); + + DB::table('sysparam')->where('alias', 'level_banip') + ->update(['body' => '14', 'updated_at' => $now]); + } +}; diff --git a/database/migrations/2026_02_26_125933_add_fishing_sysparam_records.php b/database/migrations/2026_02_26_125933_add_fishing_sysparam_records.php new file mode 100644 index 0000000..2e594e0 --- /dev/null +++ b/database/migrations/2026_02_26_125933_add_fishing_sysparam_records.php @@ -0,0 +1,64 @@ +insertOrIgnore([ + [ + 'alias' => 'fishing_cost', + 'body' => '5', + 'guidetxt' => '每次钓鱼花费金币数量', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'fishing_cooldown', + 'body' => '300', + 'guidetxt' => '钓鱼冷却时间(秒,默认300秒=5分钟)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'fishing_wait_min', + 'body' => '8', + 'guidetxt' => '钓鱼最短等待上钩时间(秒)', + 'created_at' => $now, + 'updated_at' => $now, + ], + [ + 'alias' => 'fishing_wait_max', + 'body' => '15', + 'guidetxt' => '钓鱼最长等待上钩时间(秒)', + 'created_at' => $now, + 'updated_at' => $now, + ], + ]); + } + + /** + * 回滚:删除钓鱼参数 + */ + public function down(): void + { + DB::table('sysparam')->whereIn('alias', [ + 'fishing_cost', + 'fishing_cooldown', + 'fishing_wait_min', + 'fishing_wait_max', + ])->delete(); + } +}; diff --git a/public/css/chat.css b/public/css/chat.css new file mode 100644 index 0000000..03b8eef --- /dev/null +++ b/public/css/chat.css @@ -0,0 +1,629 @@ +/** + * 文件功能:聊天室主界面样式表 + * 复刻原版海军蓝聊天室色系 (CHAT.CSS) + * 包含布局、消息窗格、输入工具栏、用户列表、弹窗等所有聊天界面样式 + * + * @author ChatRoom Laravel + * @version 1.0.0 + */ + +/* ═══════════════════════════════════════════════════ + 原版海军蓝聊天室色系 (CHAT.CSS 复刻) + ═══════════════════════════════════════════════════ */ +:root { + --bg-main: #EAF2FF; + --bg-bar: #b0d8ff; + --bg-header: #4488aa; + --bg-toolbar: #5599aa; + --text-link: #336699; + --text-navy: #112233; + --text-white: #ffffff; + --border-blue: #336699; + --scrollbar-base: #b0d8ff; + --scrollbar-arrow: #336699; + --scrollbar-track: #EAF2FF; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Microsoft YaHei", "SimSun", "宋体", sans-serif; + font-size: 10pt; + background: var(--bg-main); + color: var(--text-navy); + overflow: hidden; + height: 100vh; +} + +/* 全局链接样式 */ +a { + color: var(--text-link); + text-decoration: none; +} + +a:hover { + color: #009900; +} + +/* 自定义滚动条 - 模拟原版 */ +::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-base); + border-radius: 2px; + border: 1px solid var(--scrollbar-arrow); +} + +::-webkit-scrollbar-track { + background-color: var(--scrollbar-track); +} + +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-base); +} + +/* ── 主布局 ─────────────────────────────────────── */ +.chat-layout { + display: flex; + height: 100vh; + width: 100vw; +} + +/* 左侧主区域 */ +.chat-left { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; +} + +/* 竖向工具条 */ +.chat-toolbar { + width: 28px; + background: var(--bg-toolbar); + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + padding: 40px 0 2px 0; + border-left: 1px solid var(--border-blue); + border-right: 1px solid var(--border-blue); + overflow-y: auto; + flex-shrink: 0; +} + +.chat-toolbar .tool-btn { + writing-mode: vertical-rl; + text-orientation: upright; + font-size: 11px; + color: #ddd; + cursor: pointer; + padding: 4px 0; + text-align: center; + transition: all 0.15s; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + letter-spacing: 2px; +} + +.chat-toolbar .tool-btn:hover { + color: #fff; + background: #5599cc; +} + +/* 右侧用户列表面板 */ +.chat-right { + width: 150px; + display: flex; + flex-direction: column; + border-left: 1px solid var(--border-blue); + background: var(--bg-main); + flex-shrink: 0; + padding-top: 2px; +} + +/* ── 标题栏 ─────────────────────────────────────── */ +.room-title-bar { + background: var(--bg-header); + color: var(--text-white); + text-align: center; + padding: 6px 10px; + font-size: 12px; + line-height: 1.6; + flex-shrink: 0; + border-bottom: 1px solid var(--border-blue); +} + +.room-title-bar .room-name { + font-weight: bold; + font-size: 14px; +} + +.room-title-bar .room-desc { + color: #cee8ff; + font-size: 11px; +} + +/* 公告/祝福语滚动条(复刻原版 marquee) */ +.room-announcement-bar { + background: linear-gradient(to right, #a8d8a8, #c8f0c8, #a8d8a8); + padding: 2px 6px; + border-bottom: 1px solid var(--border-blue); + flex-shrink: 0; + height: 20px; + line-height: 20px; + overflow: hidden; +} + +/* ── 消息窗格 ───────────────────────────────────── */ +.message-panes { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; +} + +.message-pane { + flex: 1; + overflow-y: auto; + padding: 5px 8px; + background: var(--bg-main); + font-size: 10pt; + line-height: 170%; + min-height: 0; +} + +.message-pane.say1 { + border-bottom: 2px solid var(--border-blue); +} + +.message-pane.say2 { + display: block; + flex: 0.4; + border-top: 2px solid var(--border-blue); +} + +.message-pane.say1 { + flex: 0.6; +} + +/* 分屏模式下两个窗格各占一半 */ +.message-panes.split-h .message-pane.say1, +.message-panes.split-h .message-pane.say2 { + flex: 1; +} + +.message-panes.split-h .message-pane.say2 { + flex: 1; +} + +.message-panes.split-h .message-pane.say1 { + flex: 1; + border-bottom: 2px solid var(--border-blue); +} + +/* 消息行样式 */ +.msg-line { + margin: 2px 0; + word-wrap: break-word; + word-break: break-all; +} + +.msg-line .msg-time { + font-size: 9px; + color: #999; +} + +.msg-line .msg-user { + cursor: pointer; + font-weight: bold; +} + +.msg-line .msg-user:hover { + text-decoration: underline; +} + +.msg-line .msg-action { + color: #009900; +} + +.msg-line .msg-secret { + color: #cc00cc; + font-style: italic; +} + +.msg-line .msg-content { + margin-left: 4px; +} + +.msg-line.sys-msg { + color: #cc0000; + text-align: center; + font-size: 9pt; +} + +/* ── 底部输入工具栏 ─────────────────────────────── */ +.input-bar { + height: auto; + min-height: 75px; + background: var(--bg-bar); + border-top: 2px solid var(--border-blue); + padding: 3px 6px; + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 3px; +} + +.input-bar select, +.input-bar input[type="text"], +.input-bar input[type="checkbox"] { + font-size: 12px; + border: 1px solid navy; + color: #224466; + padding: 1px 2px; + background: #fff; +} + +.input-bar select { + max-width: 100px; +} + +.input-bar .input-row { + display: flex; + align-items: center; + gap: 4px; + flex-wrap: wrap; +} + +.input-bar .say-input { + flex: 1; + min-width: 200px; + font-size: 12px; + border: 1px solid navy; + color: #224466; + padding: 3px 5px; + outline: none; +} + +.input-bar .say-input:focus { + border-color: #0066cc; + box-shadow: 0 0 3px rgba(0, 102, 204, 0.3); +} + +.input-bar .send-btn { + background: var(--bg-header); + color: white; + border: 1px solid var(--border-blue); + padding: 3px 12px; + font-size: 12px; + font-weight: bold; + cursor: pointer; + transition: background 0.15s; +} + +.input-bar .send-btn:hover { + background: #336699; +} + +.input-bar .send-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.input-bar label { + font-size: 12px; + cursor: pointer; + white-space: nowrap; + display: flex; + align-items: center; + gap: 2px; +} + +/* ── 右侧用户列表 Tab 栏 ──────────────────────── */ +.right-tabs { + display: flex; + background: var(--bg-bar); + border-bottom: 2px solid navy; + flex-shrink: 0; +} + +.right-tabs .tab-btn { + flex: 1; + text-align: center; + font-size: 12px; + padding: 3px 0; + cursor: pointer; + color: navy; + background: var(--bg-bar); + border: none; + font-family: inherit; + transition: all 0.15s; + user-select: none; +} + +.right-tabs .tab-btn.active { + background: navy; + color: white; +} + +.right-tabs .tab-btn:hover:not(.active) { + background: #99c8ee; +} + +/* 用户列表内容 */ +.user-list-content { + flex: 1; + overflow-y: auto; + padding: 4px; +} + +.user-item { + display: flex; + align-items: center; + gap: 4px; + padding: 3px 4px; + cursor: pointer; + font-size: 12px; + border-bottom: 1px dotted #cde; + transition: background 0.15s; +} + +.user-item:hover { + background: #d0e8ff; +} + +.user-item .user-head { + width: 36px; + height: 36px; + border-radius: 2px; + object-fit: cover; + background: #ddd; + flex-shrink: 0; +} + +.user-item .user-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: var(--text-link); + font-weight: bold; +} + +.user-item .user-sex { + font-size: 10px; +} + +.user-item .user-level { + font-size: 9px; + color: #999; +} + +/* 在线人数统计 */ +.online-stats { + background: var(--bg-bar); + text-align: center; + font-size: 11px; + padding: 3px; + border-top: 1px solid var(--border-blue); + color: navy; + flex-shrink: 0; +} + +/* ── 用户名片弹窗 ───────────────────────────────── */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.5); + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; +} + +.modal-card { + background: white; + border: 2px solid var(--border-blue); + border-radius: 8px; + width: 340px; + max-width: 90vw; + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.3); + overflow: hidden; +} + +.modal-header { + background: linear-gradient(135deg, var(--bg-header), var(--border-blue)); + color: white; + padding: 12px 16px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.modal-header h3 { + font-size: 16px; + font-weight: bold; +} + +.modal-close { + background: none; + border: none; + color: white; + font-size: 20px; + cursor: pointer; + opacity: 0.8; +} + +.modal-close:hover { + opacity: 1; +} + +.modal-body { + padding: 16px; +} + +.modal-body .profile-row { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 12px; +} + +.modal-body .profile-avatar { + width: 56px; + height: 56px; + border-radius: 6px; + object-fit: cover; + border: 2px solid var(--bg-bar); + background: #eee; +} + +.modal-body .profile-info h4 { + font-size: 16px; + font-weight: bold; + color: var(--text-navy); +} + +.modal-body .profile-info .level-badge { + display: inline-block; + background: var(--bg-bar); + color: var(--border-blue); + font-size: 11px; + padding: 1px 6px; + border-radius: 10px; + font-weight: bold; + margin-left: 4px; +} + +.modal-body .profile-info .sex-badge { + font-size: 11px; + margin-left: 2px; +} + +.modal-body .profile-detail { + background: #f5f9ff; + border: 1px solid #e0ecff; + border-radius: 6px; + padding: 8px 12px; + font-size: 12px; + color: #666; + margin-bottom: 12px; +} + +.modal-actions { + padding: 0 16px 16px; + display: flex; + gap: 8px; +} + +.modal-actions button, +.modal-actions a { + flex: 1; + text-align: center; + padding: 6px 0; + border-radius: 6px; + font-size: 12px; + font-weight: bold; + cursor: pointer; + border: 1px solid; + transition: all 0.15s; + text-decoration: none; + display: block; +} + +.btn-kick { + background: #fee; + color: #c00; + border-color: #fcc; +} + +.btn-kick:hover { + background: #fcc; +} + +.btn-mute { + background: #fff8e6; + color: #b86e00; + border-color: #ffe0a0; +} + +.btn-mute:hover { + background: #ffe0a0; +} + +.btn-mail { + background: #f0e8ff; + color: #6633cc; + border-color: #d8c8ff; +} + +.btn-mail:hover { + background: #d8c8ff; +} + +.btn-whisper { + background: #e8f5ff; + color: var(--text-link); + border-color: var(--bg-bar); +} + +.btn-whisper:hover { + background: var(--bg-bar); +} + +/* 禁言输入行 */ +.mute-form { + display: flex; + align-items: center; + gap: 6px; + padding: 0 16px 12px; +} + +.mute-form input { + width: 60px; + border: 1px solid #ffe0a0; + border-radius: 4px; + padding: 3px 6px; + font-size: 12px; +} + +.mute-form button { + background: #b86e00; + color: white; + border: none; + border-radius: 4px; + padding: 4px 10px; + font-size: 12px; + cursor: pointer; +} + +/* ── 头像选择器 ─────────────────────────────────── */ +.avatar-option { + width: 36px; + height: 36px; + cursor: pointer; + border: 2px solid transparent; + border-radius: 3px; + transition: border-color 0.15s, transform 0.15s; +} + +.avatar-option:hover { + border-color: #88bbdd; + transform: scale(1.15); +} + +.avatar-option.selected { + border-color: #336699; + box-shadow: 0 0 6px rgba(51, 102, 153, 0.5); +} diff --git a/public/images/headface/084.gif b/public/images/headface/084.gif new file mode 100644 index 0000000..883fa14 Binary files /dev/null and b/public/images/headface/084.gif differ diff --git a/public/images/headface/086.gif b/public/images/headface/086.gif new file mode 100644 index 0000000..8559ab0 Binary files /dev/null and b/public/images/headface/086.gif differ diff --git a/public/images/headface/1.GIF b/public/images/headface/1.GIF new file mode 100644 index 0000000..67c50aa Binary files /dev/null and b/public/images/headface/1.GIF differ diff --git a/public/images/headface/10.GIF b/public/images/headface/10.GIF new file mode 100644 index 0000000..395d3d7 Binary files /dev/null and b/public/images/headface/10.GIF differ diff --git a/public/images/headface/100.GIF b/public/images/headface/100.GIF new file mode 100644 index 0000000..d094dc4 Binary files /dev/null and b/public/images/headface/100.GIF differ diff --git a/public/images/headface/10001.GIF b/public/images/headface/10001.GIF new file mode 100644 index 0000000..e4b7fe1 Binary files /dev/null and b/public/images/headface/10001.GIF differ diff --git a/public/images/headface/10002.GIF b/public/images/headface/10002.GIF new file mode 100644 index 0000000..8587ccb Binary files /dev/null and b/public/images/headface/10002.GIF differ diff --git a/public/images/headface/10003.GIF b/public/images/headface/10003.GIF new file mode 100644 index 0000000..5b4ba12 Binary files /dev/null and b/public/images/headface/10003.GIF differ diff --git a/public/images/headface/10004.GIF b/public/images/headface/10004.GIF new file mode 100644 index 0000000..24731c4 Binary files /dev/null and b/public/images/headface/10004.GIF differ diff --git a/public/images/headface/10005.GIF b/public/images/headface/10005.GIF new file mode 100644 index 0000000..a0e6385 Binary files /dev/null and b/public/images/headface/10005.GIF differ diff --git a/public/images/headface/10006.GIF b/public/images/headface/10006.GIF new file mode 100644 index 0000000..c3d72ce Binary files /dev/null and b/public/images/headface/10006.GIF differ diff --git a/public/images/headface/10008.GIF b/public/images/headface/10008.GIF new file mode 100644 index 0000000..afb2899 Binary files /dev/null and b/public/images/headface/10008.GIF differ diff --git a/public/images/headface/10009.GIF b/public/images/headface/10009.GIF new file mode 100644 index 0000000..dc3f334 Binary files /dev/null and b/public/images/headface/10009.GIF differ diff --git a/public/images/headface/1001.gif b/public/images/headface/1001.gif new file mode 100644 index 0000000..e2f9bf8 Binary files /dev/null and b/public/images/headface/1001.gif differ diff --git a/public/images/headface/10010.GIF b/public/images/headface/10010.GIF new file mode 100644 index 0000000..87a7f44 Binary files /dev/null and b/public/images/headface/10010.GIF differ diff --git a/public/images/headface/10011.GIF b/public/images/headface/10011.GIF new file mode 100644 index 0000000..d094dc4 Binary files /dev/null and b/public/images/headface/10011.GIF differ diff --git a/public/images/headface/10012.GIF b/public/images/headface/10012.GIF new file mode 100644 index 0000000..8fa0fb7 Binary files /dev/null and b/public/images/headface/10012.GIF differ diff --git a/public/images/headface/10013.GIF b/public/images/headface/10013.GIF new file mode 100644 index 0000000..ffc5e5a Binary files /dev/null and b/public/images/headface/10013.GIF differ diff --git a/public/images/headface/10015.GIF b/public/images/headface/10015.GIF new file mode 100644 index 0000000..81d3a13 Binary files /dev/null and b/public/images/headface/10015.GIF differ diff --git a/public/images/headface/10016.GIF b/public/images/headface/10016.GIF new file mode 100644 index 0000000..6e8f146 Binary files /dev/null and b/public/images/headface/10016.GIF differ diff --git a/public/images/headface/10017.GIF b/public/images/headface/10017.GIF new file mode 100644 index 0000000..0d8f256 Binary files /dev/null and b/public/images/headface/10017.GIF differ diff --git a/public/images/headface/10019.GIF b/public/images/headface/10019.GIF new file mode 100644 index 0000000..e59e429 Binary files /dev/null and b/public/images/headface/10019.GIF differ diff --git a/public/images/headface/10020.GIF b/public/images/headface/10020.GIF new file mode 100644 index 0000000..f8c2124 Binary files /dev/null and b/public/images/headface/10020.GIF differ diff --git a/public/images/headface/10021.GIF b/public/images/headface/10021.GIF new file mode 100644 index 0000000..a3c1bbd Binary files /dev/null and b/public/images/headface/10021.GIF differ diff --git a/public/images/headface/10022.GIF b/public/images/headface/10022.GIF new file mode 100644 index 0000000..dc23175 Binary files /dev/null and b/public/images/headface/10022.GIF differ diff --git a/public/images/headface/10024.GIF b/public/images/headface/10024.GIF new file mode 100644 index 0000000..231067f Binary files /dev/null and b/public/images/headface/10024.GIF differ diff --git a/public/images/headface/10025.GIF b/public/images/headface/10025.GIF new file mode 100644 index 0000000..e2f3fde Binary files /dev/null and b/public/images/headface/10025.GIF differ diff --git a/public/images/headface/10026.GIF b/public/images/headface/10026.GIF new file mode 100644 index 0000000..7811d07 Binary files /dev/null and b/public/images/headface/10026.GIF differ diff --git a/public/images/headface/10028.GIF b/public/images/headface/10028.GIF new file mode 100644 index 0000000..1029aa6 Binary files /dev/null and b/public/images/headface/10028.GIF differ diff --git a/public/images/headface/10029.GIF b/public/images/headface/10029.GIF new file mode 100644 index 0000000..f6f4600 Binary files /dev/null and b/public/images/headface/10029.GIF differ diff --git a/public/images/headface/10031.GIF b/public/images/headface/10031.GIF new file mode 100644 index 0000000..f3d52cb Binary files /dev/null and b/public/images/headface/10031.GIF differ diff --git a/public/images/headface/10032.GIF b/public/images/headface/10032.GIF new file mode 100644 index 0000000..b413dbb Binary files /dev/null and b/public/images/headface/10032.GIF differ diff --git a/public/images/headface/10033.GIF b/public/images/headface/10033.GIF new file mode 100644 index 0000000..b41b77d Binary files /dev/null and b/public/images/headface/10033.GIF differ diff --git a/public/images/headface/10035.GIF b/public/images/headface/10035.GIF new file mode 100644 index 0000000..c58dfce Binary files /dev/null and b/public/images/headface/10035.GIF differ diff --git a/public/images/headface/10036.GIF b/public/images/headface/10036.GIF new file mode 100644 index 0000000..5d8b1dd Binary files /dev/null and b/public/images/headface/10036.GIF differ diff --git a/public/images/headface/10037.GIF b/public/images/headface/10037.GIF new file mode 100644 index 0000000..334cecb Binary files /dev/null and b/public/images/headface/10037.GIF differ diff --git a/public/images/headface/10038.GIF b/public/images/headface/10038.GIF new file mode 100644 index 0000000..72dfab2 Binary files /dev/null and b/public/images/headface/10038.GIF differ diff --git a/public/images/headface/10039.GIF b/public/images/headface/10039.GIF new file mode 100644 index 0000000..c85edd3 Binary files /dev/null and b/public/images/headface/10039.GIF differ diff --git a/public/images/headface/10041.GIF b/public/images/headface/10041.GIF new file mode 100644 index 0000000..79977dd Binary files /dev/null and b/public/images/headface/10041.GIF differ diff --git a/public/images/headface/10043.GIF b/public/images/headface/10043.GIF new file mode 100644 index 0000000..a703d81 Binary files /dev/null and b/public/images/headface/10043.GIF differ diff --git a/public/images/headface/10044.GIF b/public/images/headface/10044.GIF new file mode 100644 index 0000000..a13215b Binary files /dev/null and b/public/images/headface/10044.GIF differ diff --git a/public/images/headface/10045.GIF b/public/images/headface/10045.GIF new file mode 100644 index 0000000..7ee49d1 Binary files /dev/null and b/public/images/headface/10045.GIF differ diff --git a/public/images/headface/10046.GIF b/public/images/headface/10046.GIF new file mode 100644 index 0000000..eca2e7f Binary files /dev/null and b/public/images/headface/10046.GIF differ diff --git a/public/images/headface/10047.GIF b/public/images/headface/10047.GIF new file mode 100644 index 0000000..e45041a Binary files /dev/null and b/public/images/headface/10047.GIF differ diff --git a/public/images/headface/10049.GIF b/public/images/headface/10049.GIF new file mode 100644 index 0000000..8f2602c Binary files /dev/null and b/public/images/headface/10049.GIF differ diff --git a/public/images/headface/10050.GIF b/public/images/headface/10050.GIF new file mode 100644 index 0000000..95f69f1 Binary files /dev/null and b/public/images/headface/10050.GIF differ diff --git a/public/images/headface/10051.GIF b/public/images/headface/10051.GIF new file mode 100644 index 0000000..1c7c873 Binary files /dev/null and b/public/images/headface/10051.GIF differ diff --git a/public/images/headface/10052.GIF b/public/images/headface/10052.GIF new file mode 100644 index 0000000..a22cc87 Binary files /dev/null and b/public/images/headface/10052.GIF differ diff --git a/public/images/headface/10053.GIF b/public/images/headface/10053.GIF new file mode 100644 index 0000000..3160e91 Binary files /dev/null and b/public/images/headface/10053.GIF differ diff --git a/public/images/headface/10054.GIF b/public/images/headface/10054.GIF new file mode 100644 index 0000000..1de7c8b Binary files /dev/null and b/public/images/headface/10054.GIF differ diff --git a/public/images/headface/10055.GIF b/public/images/headface/10055.GIF new file mode 100644 index 0000000..2acfbdc Binary files /dev/null and b/public/images/headface/10055.GIF differ diff --git a/public/images/headface/10056.GIF b/public/images/headface/10056.GIF new file mode 100644 index 0000000..9d00167 Binary files /dev/null and b/public/images/headface/10056.GIF differ diff --git a/public/images/headface/10057.GIF b/public/images/headface/10057.GIF new file mode 100644 index 0000000..8d8e4c7 Binary files /dev/null and b/public/images/headface/10057.GIF differ diff --git a/public/images/headface/10058.GIF b/public/images/headface/10058.GIF new file mode 100644 index 0000000..f1bf6fa Binary files /dev/null and b/public/images/headface/10058.GIF differ diff --git a/public/images/headface/10059.GIF b/public/images/headface/10059.GIF new file mode 100644 index 0000000..a2fce53 Binary files /dev/null and b/public/images/headface/10059.GIF differ diff --git a/public/images/headface/10061.GIF b/public/images/headface/10061.GIF new file mode 100644 index 0000000..2842cf6 Binary files /dev/null and b/public/images/headface/10061.GIF differ diff --git a/public/images/headface/10062.GIF b/public/images/headface/10062.GIF new file mode 100644 index 0000000..ebe1102 Binary files /dev/null and b/public/images/headface/10062.GIF differ diff --git a/public/images/headface/10064.GIF b/public/images/headface/10064.GIF new file mode 100644 index 0000000..d22d1a5 Binary files /dev/null and b/public/images/headface/10064.GIF differ diff --git a/public/images/headface/10065.GIF b/public/images/headface/10065.GIF new file mode 100644 index 0000000..6a4f3fa Binary files /dev/null and b/public/images/headface/10065.GIF differ diff --git a/public/images/headface/10066.GIF b/public/images/headface/10066.GIF new file mode 100644 index 0000000..9f2337c Binary files /dev/null and b/public/images/headface/10066.GIF differ diff --git a/public/images/headface/10067.GIF b/public/images/headface/10067.GIF new file mode 100644 index 0000000..13b426d Binary files /dev/null and b/public/images/headface/10067.GIF differ diff --git a/public/images/headface/10068.GIF b/public/images/headface/10068.GIF new file mode 100644 index 0000000..7471732 Binary files /dev/null and b/public/images/headface/10068.GIF differ diff --git a/public/images/headface/10069.GIF b/public/images/headface/10069.GIF new file mode 100644 index 0000000..8214084 Binary files /dev/null and b/public/images/headface/10069.GIF differ diff --git a/public/images/headface/101.gif b/public/images/headface/101.gif new file mode 100644 index 0000000..a8db463 Binary files /dev/null and b/public/images/headface/101.gif differ diff --git a/public/images/headface/1010.GIF b/public/images/headface/1010.GIF new file mode 100644 index 0000000..a2da8c0 Binary files /dev/null and b/public/images/headface/1010.GIF differ diff --git a/public/images/headface/1012.gif b/public/images/headface/1012.gif new file mode 100644 index 0000000..25d1b64 Binary files /dev/null and b/public/images/headface/1012.gif differ diff --git a/public/images/headface/102.gif b/public/images/headface/102.gif new file mode 100644 index 0000000..0f84e80 Binary files /dev/null and b/public/images/headface/102.gif differ diff --git a/public/images/headface/1020.GIF b/public/images/headface/1020.GIF new file mode 100644 index 0000000..b08dfe4 Binary files /dev/null and b/public/images/headface/1020.GIF differ diff --git a/public/images/headface/103.gif b/public/images/headface/103.gif new file mode 100644 index 0000000..553a6b8 Binary files /dev/null and b/public/images/headface/103.gif differ diff --git a/public/images/headface/1030.GIF b/public/images/headface/1030.GIF new file mode 100644 index 0000000..29df4d5 Binary files /dev/null and b/public/images/headface/1030.GIF differ diff --git a/public/images/headface/1040.GIF b/public/images/headface/1040.GIF new file mode 100644 index 0000000..731d464 Binary files /dev/null and b/public/images/headface/1040.GIF differ diff --git a/public/images/headface/105.gif b/public/images/headface/105.gif new file mode 100644 index 0000000..9bcbd54 Binary files /dev/null and b/public/images/headface/105.gif differ diff --git a/public/images/headface/1050.GIF b/public/images/headface/1050.GIF new file mode 100644 index 0000000..d094b94 Binary files /dev/null and b/public/images/headface/1050.GIF differ diff --git a/public/images/headface/106.gif b/public/images/headface/106.gif new file mode 100644 index 0000000..25d1b64 Binary files /dev/null and b/public/images/headface/106.gif differ diff --git a/public/images/headface/1060.GIF b/public/images/headface/1060.GIF new file mode 100644 index 0000000..adefc1f Binary files /dev/null and b/public/images/headface/1060.GIF differ diff --git a/public/images/headface/107.gif b/public/images/headface/107.gif new file mode 100644 index 0000000..9e1049a Binary files /dev/null and b/public/images/headface/107.gif differ diff --git a/public/images/headface/1070.GIF b/public/images/headface/1070.GIF new file mode 100644 index 0000000..da159a5 Binary files /dev/null and b/public/images/headface/1070.GIF differ diff --git a/public/images/headface/108.gif b/public/images/headface/108.gif new file mode 100644 index 0000000..cfed647 Binary files /dev/null and b/public/images/headface/108.gif differ diff --git a/public/images/headface/1080.GIF b/public/images/headface/1080.GIF new file mode 100644 index 0000000..bf11bb9 Binary files /dev/null and b/public/images/headface/1080.GIF differ diff --git a/public/images/headface/109.gif b/public/images/headface/109.gif new file mode 100644 index 0000000..55d2ecb Binary files /dev/null and b/public/images/headface/109.gif differ diff --git a/public/images/headface/1090.GIF b/public/images/headface/1090.GIF new file mode 100644 index 0000000..2774677 Binary files /dev/null and b/public/images/headface/1090.GIF differ diff --git a/public/images/headface/11.gif b/public/images/headface/11.gif new file mode 100644 index 0000000..c16a333 Binary files /dev/null and b/public/images/headface/11.gif differ diff --git a/public/images/headface/110.gif b/public/images/headface/110.gif new file mode 100644 index 0000000..76fa879 Binary files /dev/null and b/public/images/headface/110.gif differ diff --git a/public/images/headface/1100.GIF b/public/images/headface/1100.GIF new file mode 100644 index 0000000..5d88099 Binary files /dev/null and b/public/images/headface/1100.GIF differ diff --git a/public/images/headface/1101.gif b/public/images/headface/1101.gif new file mode 100644 index 0000000..c7776d1 Binary files /dev/null and b/public/images/headface/1101.gif differ diff --git a/public/images/headface/1104.gif b/public/images/headface/1104.gif new file mode 100644 index 0000000..9b28d39 Binary files /dev/null and b/public/images/headface/1104.gif differ diff --git a/public/images/headface/111.gif b/public/images/headface/111.gif new file mode 100644 index 0000000..64f1e3f Binary files /dev/null and b/public/images/headface/111.gif differ diff --git a/public/images/headface/1110.GIF b/public/images/headface/1110.GIF new file mode 100644 index 0000000..c2d7f8c Binary files /dev/null and b/public/images/headface/1110.GIF differ diff --git a/public/images/headface/112.gif b/public/images/headface/112.gif new file mode 100644 index 0000000..3f22465 Binary files /dev/null and b/public/images/headface/112.gif differ diff --git a/public/images/headface/1120.GIF b/public/images/headface/1120.GIF new file mode 100644 index 0000000..7cb6c22 Binary files /dev/null and b/public/images/headface/1120.GIF differ diff --git a/public/images/headface/113.gif b/public/images/headface/113.gif new file mode 100644 index 0000000..291a9ef Binary files /dev/null and b/public/images/headface/113.gif differ diff --git a/public/images/headface/1130.GIF b/public/images/headface/1130.GIF new file mode 100644 index 0000000..e7f3dea Binary files /dev/null and b/public/images/headface/1130.GIF differ diff --git a/public/images/headface/114.gif b/public/images/headface/114.gif new file mode 100644 index 0000000..68f8dc1 Binary files /dev/null and b/public/images/headface/114.gif differ diff --git a/public/images/headface/1140.GIF b/public/images/headface/1140.GIF new file mode 100644 index 0000000..e8c267b Binary files /dev/null and b/public/images/headface/1140.GIF differ diff --git a/public/images/headface/115.gif b/public/images/headface/115.gif new file mode 100644 index 0000000..8c863ad Binary files /dev/null and b/public/images/headface/115.gif differ diff --git a/public/images/headface/1150.GIF b/public/images/headface/1150.GIF new file mode 100644 index 0000000..9b113fc Binary files /dev/null and b/public/images/headface/1150.GIF differ diff --git a/public/images/headface/116.gif b/public/images/headface/116.gif new file mode 100644 index 0000000..98169ab Binary files /dev/null and b/public/images/headface/116.gif differ diff --git a/public/images/headface/1160.GIF b/public/images/headface/1160.GIF new file mode 100644 index 0000000..6cd3fc3 Binary files /dev/null and b/public/images/headface/1160.GIF differ diff --git a/public/images/headface/117.gif b/public/images/headface/117.gif new file mode 100644 index 0000000..62e2271 Binary files /dev/null and b/public/images/headface/117.gif differ diff --git a/public/images/headface/1170.GIF b/public/images/headface/1170.GIF new file mode 100644 index 0000000..794a3d2 Binary files /dev/null and b/public/images/headface/1170.GIF differ diff --git a/public/images/headface/118.gif b/public/images/headface/118.gif new file mode 100644 index 0000000..a9686ca Binary files /dev/null and b/public/images/headface/118.gif differ diff --git a/public/images/headface/1180.GIF b/public/images/headface/1180.GIF new file mode 100644 index 0000000..cd19760 Binary files /dev/null and b/public/images/headface/1180.GIF differ diff --git a/public/images/headface/119.gif b/public/images/headface/119.gif new file mode 100644 index 0000000..30f5188 Binary files /dev/null and b/public/images/headface/119.gif differ diff --git a/public/images/headface/1190.GIF b/public/images/headface/1190.GIF new file mode 100644 index 0000000..6db0ef2 Binary files /dev/null and b/public/images/headface/1190.GIF differ diff --git a/public/images/headface/12.gif b/public/images/headface/12.gif new file mode 100644 index 0000000..f36578d Binary files /dev/null and b/public/images/headface/12.gif differ diff --git a/public/images/headface/120.gif b/public/images/headface/120.gif new file mode 100644 index 0000000..59f7b35 Binary files /dev/null and b/public/images/headface/120.gif differ diff --git a/public/images/headface/1200.GIF b/public/images/headface/1200.GIF new file mode 100644 index 0000000..dbbae68 Binary files /dev/null and b/public/images/headface/1200.GIF differ diff --git a/public/images/headface/121.gif b/public/images/headface/121.gif new file mode 100644 index 0000000..79d168a Binary files /dev/null and b/public/images/headface/121.gif differ diff --git a/public/images/headface/1210.GIF b/public/images/headface/1210.GIF new file mode 100644 index 0000000..bcd32f2 Binary files /dev/null and b/public/images/headface/1210.GIF differ diff --git a/public/images/headface/122.gif b/public/images/headface/122.gif new file mode 100644 index 0000000..a6ea05f Binary files /dev/null and b/public/images/headface/122.gif differ diff --git a/public/images/headface/1220.GIF b/public/images/headface/1220.GIF new file mode 100644 index 0000000..d55a241 Binary files /dev/null and b/public/images/headface/1220.GIF differ diff --git a/public/images/headface/123.gif b/public/images/headface/123.gif new file mode 100644 index 0000000..0b7095a Binary files /dev/null and b/public/images/headface/123.gif differ diff --git a/public/images/headface/1230.GIF b/public/images/headface/1230.GIF new file mode 100644 index 0000000..e68036d Binary files /dev/null and b/public/images/headface/1230.GIF differ diff --git a/public/images/headface/124.gif b/public/images/headface/124.gif new file mode 100644 index 0000000..4750e38 Binary files /dev/null and b/public/images/headface/124.gif differ diff --git a/public/images/headface/1240.GIF b/public/images/headface/1240.GIF new file mode 100644 index 0000000..d879625 Binary files /dev/null and b/public/images/headface/1240.GIF differ diff --git a/public/images/headface/1241.gif b/public/images/headface/1241.gif new file mode 100644 index 0000000..3ac5ae5 Binary files /dev/null and b/public/images/headface/1241.gif differ diff --git a/public/images/headface/125.gif b/public/images/headface/125.gif new file mode 100644 index 0000000..dd2b374 Binary files /dev/null and b/public/images/headface/125.gif differ diff --git a/public/images/headface/1250.GIF b/public/images/headface/1250.GIF new file mode 100644 index 0000000..fcdd856 Binary files /dev/null and b/public/images/headface/1250.GIF differ diff --git a/public/images/headface/126.gif b/public/images/headface/126.gif new file mode 100644 index 0000000..49efc83 Binary files /dev/null and b/public/images/headface/126.gif differ diff --git a/public/images/headface/1260.GIF b/public/images/headface/1260.GIF new file mode 100644 index 0000000..0260c4e Binary files /dev/null and b/public/images/headface/1260.GIF differ diff --git a/public/images/headface/127.gif b/public/images/headface/127.gif new file mode 100644 index 0000000..ddffe2a Binary files /dev/null and b/public/images/headface/127.gif differ diff --git a/public/images/headface/1270.GIF b/public/images/headface/1270.GIF new file mode 100644 index 0000000..24ddcd5 Binary files /dev/null and b/public/images/headface/1270.GIF differ diff --git a/public/images/headface/128.gif b/public/images/headface/128.gif new file mode 100644 index 0000000..d18931b Binary files /dev/null and b/public/images/headface/128.gif differ diff --git a/public/images/headface/1280.GIF b/public/images/headface/1280.GIF new file mode 100644 index 0000000..f601117 Binary files /dev/null and b/public/images/headface/1280.GIF differ diff --git a/public/images/headface/129.gif b/public/images/headface/129.gif new file mode 100644 index 0000000..29abcc2 Binary files /dev/null and b/public/images/headface/129.gif differ diff --git a/public/images/headface/1290.GIF b/public/images/headface/1290.GIF new file mode 100644 index 0000000..0bfbd14 Binary files /dev/null and b/public/images/headface/1290.GIF differ diff --git a/public/images/headface/13.GIF b/public/images/headface/13.GIF new file mode 100644 index 0000000..d098031 Binary files /dev/null and b/public/images/headface/13.GIF differ diff --git a/public/images/headface/130.gif b/public/images/headface/130.gif new file mode 100644 index 0000000..a5d7f22 Binary files /dev/null and b/public/images/headface/130.gif differ diff --git a/public/images/headface/1300.GIF b/public/images/headface/1300.GIF new file mode 100644 index 0000000..09dd849 Binary files /dev/null and b/public/images/headface/1300.GIF differ diff --git a/public/images/headface/131..gif b/public/images/headface/131..gif new file mode 100644 index 0000000..fa42411 Binary files /dev/null and b/public/images/headface/131..gif differ diff --git a/public/images/headface/1310.GIF b/public/images/headface/1310.GIF new file mode 100644 index 0000000..ac45fcc Binary files /dev/null and b/public/images/headface/1310.GIF differ diff --git a/public/images/headface/132.gif b/public/images/headface/132.gif new file mode 100644 index 0000000..7e76f83 Binary files /dev/null and b/public/images/headface/132.gif differ diff --git a/public/images/headface/1320.GIF b/public/images/headface/1320.GIF new file mode 100644 index 0000000..eaceba4 Binary files /dev/null and b/public/images/headface/1320.GIF differ diff --git a/public/images/headface/1321.gif b/public/images/headface/1321.gif new file mode 100644 index 0000000..84dc1d3 Binary files /dev/null and b/public/images/headface/1321.gif differ diff --git a/public/images/headface/133.gif b/public/images/headface/133.gif new file mode 100644 index 0000000..935f7e3 Binary files /dev/null and b/public/images/headface/133.gif differ diff --git a/public/images/headface/1330.GIF b/public/images/headface/1330.GIF new file mode 100644 index 0000000..d9bda6b Binary files /dev/null and b/public/images/headface/1330.GIF differ diff --git a/public/images/headface/134.gif b/public/images/headface/134.gif new file mode 100644 index 0000000..0b1a74b Binary files /dev/null and b/public/images/headface/134.gif differ diff --git a/public/images/headface/1340.GIF b/public/images/headface/1340.GIF new file mode 100644 index 0000000..0535793 Binary files /dev/null and b/public/images/headface/1340.GIF differ diff --git a/public/images/headface/135.gif b/public/images/headface/135.gif new file mode 100644 index 0000000..df71f56 Binary files /dev/null and b/public/images/headface/135.gif differ diff --git a/public/images/headface/1350.GIF b/public/images/headface/1350.GIF new file mode 100644 index 0000000..dba28c7 Binary files /dev/null and b/public/images/headface/1350.GIF differ diff --git a/public/images/headface/136.gif b/public/images/headface/136.gif new file mode 100644 index 0000000..115c7df Binary files /dev/null and b/public/images/headface/136.gif differ diff --git a/public/images/headface/1360.GIF b/public/images/headface/1360.GIF new file mode 100644 index 0000000..43e7814 Binary files /dev/null and b/public/images/headface/1360.GIF differ diff --git a/public/images/headface/137.gif b/public/images/headface/137.gif new file mode 100644 index 0000000..20e6a37 Binary files /dev/null and b/public/images/headface/137.gif differ diff --git a/public/images/headface/1370.GIF b/public/images/headface/1370.GIF new file mode 100644 index 0000000..3d3154b Binary files /dev/null and b/public/images/headface/1370.GIF differ diff --git a/public/images/headface/138.gif b/public/images/headface/138.gif new file mode 100644 index 0000000..067744b Binary files /dev/null and b/public/images/headface/138.gif differ diff --git a/public/images/headface/1380.GIF b/public/images/headface/1380.GIF new file mode 100644 index 0000000..f151c36 Binary files /dev/null and b/public/images/headface/1380.GIF differ diff --git a/public/images/headface/1390.GIF b/public/images/headface/1390.GIF new file mode 100644 index 0000000..4a9cd96 Binary files /dev/null and b/public/images/headface/1390.GIF differ diff --git a/public/images/headface/14.GIF b/public/images/headface/14.GIF new file mode 100644 index 0000000..51f5dee Binary files /dev/null and b/public/images/headface/14.GIF differ diff --git a/public/images/headface/140.gif b/public/images/headface/140.gif new file mode 100644 index 0000000..e033fe0 Binary files /dev/null and b/public/images/headface/140.gif differ diff --git a/public/images/headface/1400.GIF b/public/images/headface/1400.GIF new file mode 100644 index 0000000..9a8401f Binary files /dev/null and b/public/images/headface/1400.GIF differ diff --git a/public/images/headface/1410.GIF b/public/images/headface/1410.GIF new file mode 100644 index 0000000..5b35977 Binary files /dev/null and b/public/images/headface/1410.GIF differ diff --git a/public/images/headface/1420.GIF b/public/images/headface/1420.GIF new file mode 100644 index 0000000..3eaba75 Binary files /dev/null and b/public/images/headface/1420.GIF differ diff --git a/public/images/headface/143.gif b/public/images/headface/143.gif new file mode 100644 index 0000000..ae40065 Binary files /dev/null and b/public/images/headface/143.gif differ diff --git a/public/images/headface/1430.GIF b/public/images/headface/1430.GIF new file mode 100644 index 0000000..3f6512f Binary files /dev/null and b/public/images/headface/1430.GIF differ diff --git a/public/images/headface/144.gif b/public/images/headface/144.gif new file mode 100644 index 0000000..1bc83a6 Binary files /dev/null and b/public/images/headface/144.gif differ diff --git a/public/images/headface/1440.GIF b/public/images/headface/1440.GIF new file mode 100644 index 0000000..d803186 Binary files /dev/null and b/public/images/headface/1440.GIF differ diff --git a/public/images/headface/1450.GIF b/public/images/headface/1450.GIF new file mode 100644 index 0000000..41937e6 Binary files /dev/null and b/public/images/headface/1450.GIF differ diff --git a/public/images/headface/1451.gif b/public/images/headface/1451.gif new file mode 100644 index 0000000..c5a866c Binary files /dev/null and b/public/images/headface/1451.gif differ diff --git a/public/images/headface/1452.gif b/public/images/headface/1452.gif new file mode 100644 index 0000000..3085c74 Binary files /dev/null and b/public/images/headface/1452.gif differ diff --git a/public/images/headface/1460.GIF b/public/images/headface/1460.GIF new file mode 100644 index 0000000..b2e9c21 Binary files /dev/null and b/public/images/headface/1460.GIF differ diff --git a/public/images/headface/1470.GIF b/public/images/headface/1470.GIF new file mode 100644 index 0000000..5c74250 Binary files /dev/null and b/public/images/headface/1470.GIF differ diff --git a/public/images/headface/1471.gif b/public/images/headface/1471.gif new file mode 100644 index 0000000..1b66394 Binary files /dev/null and b/public/images/headface/1471.gif differ diff --git a/public/images/headface/1472.gif b/public/images/headface/1472.gif new file mode 100644 index 0000000..5635651 Binary files /dev/null and b/public/images/headface/1472.gif differ diff --git a/public/images/headface/1477.gif b/public/images/headface/1477.gif new file mode 100644 index 0000000..6a14dc7 Binary files /dev/null and b/public/images/headface/1477.gif differ diff --git a/public/images/headface/1480.GIF b/public/images/headface/1480.GIF new file mode 100644 index 0000000..f246a95 Binary files /dev/null and b/public/images/headface/1480.GIF differ diff --git a/public/images/headface/1490.GIF b/public/images/headface/1490.GIF new file mode 100644 index 0000000..6e83fd0 Binary files /dev/null and b/public/images/headface/1490.GIF differ diff --git a/public/images/headface/15.GIF b/public/images/headface/15.GIF new file mode 100644 index 0000000..f1e2ea6 Binary files /dev/null and b/public/images/headface/15.GIF differ diff --git a/public/images/headface/1500.GIF b/public/images/headface/1500.GIF new file mode 100644 index 0000000..1111f19 Binary files /dev/null and b/public/images/headface/1500.GIF differ diff --git a/public/images/headface/1510.GIF b/public/images/headface/1510.GIF new file mode 100644 index 0000000..0562e71 Binary files /dev/null and b/public/images/headface/1510.GIF differ diff --git a/public/images/headface/1520.GIF b/public/images/headface/1520.GIF new file mode 100644 index 0000000..304b227 Binary files /dev/null and b/public/images/headface/1520.GIF differ diff --git a/public/images/headface/1530.GIF b/public/images/headface/1530.GIF new file mode 100644 index 0000000..16418dc Binary files /dev/null and b/public/images/headface/1530.GIF differ diff --git a/public/images/headface/1540.GIF b/public/images/headface/1540.GIF new file mode 100644 index 0000000..5314f14 Binary files /dev/null and b/public/images/headface/1540.GIF differ diff --git a/public/images/headface/1550.GIF b/public/images/headface/1550.GIF new file mode 100644 index 0000000..84814e6 Binary files /dev/null and b/public/images/headface/1550.GIF differ diff --git a/public/images/headface/1560.GIF b/public/images/headface/1560.GIF new file mode 100644 index 0000000..c57412c Binary files /dev/null and b/public/images/headface/1560.GIF differ diff --git a/public/images/headface/1580.GIF b/public/images/headface/1580.GIF new file mode 100644 index 0000000..e075879 Binary files /dev/null and b/public/images/headface/1580.GIF differ diff --git a/public/images/headface/1590.GIF b/public/images/headface/1590.GIF new file mode 100644 index 0000000..b0a332b Binary files /dev/null and b/public/images/headface/1590.GIF differ diff --git a/public/images/headface/16.gif b/public/images/headface/16.gif new file mode 100644 index 0000000..7e97d62 Binary files /dev/null and b/public/images/headface/16.gif differ diff --git a/public/images/headface/1600.GIF b/public/images/headface/1600.GIF new file mode 100644 index 0000000..303455a Binary files /dev/null and b/public/images/headface/1600.GIF differ diff --git a/public/images/headface/1610.GIF b/public/images/headface/1610.GIF new file mode 100644 index 0000000..0a736f5 Binary files /dev/null and b/public/images/headface/1610.GIF differ diff --git a/public/images/headface/1620.GIF b/public/images/headface/1620.GIF new file mode 100644 index 0000000..dda0a3b Binary files /dev/null and b/public/images/headface/1620.GIF differ diff --git a/public/images/headface/1630.GIF b/public/images/headface/1630.GIF new file mode 100644 index 0000000..69f1ef7 Binary files /dev/null and b/public/images/headface/1630.GIF differ diff --git a/public/images/headface/1640.GIF b/public/images/headface/1640.GIF new file mode 100644 index 0000000..3f34987 Binary files /dev/null and b/public/images/headface/1640.GIF differ diff --git a/public/images/headface/1650.GIF b/public/images/headface/1650.GIF new file mode 100644 index 0000000..ec5ff7b Binary files /dev/null and b/public/images/headface/1650.GIF differ diff --git a/public/images/headface/1660.GIF b/public/images/headface/1660.GIF new file mode 100644 index 0000000..098fd9c Binary files /dev/null and b/public/images/headface/1660.GIF differ diff --git a/public/images/headface/169.gif b/public/images/headface/169.gif new file mode 100644 index 0000000..1f2f30b Binary files /dev/null and b/public/images/headface/169.gif differ diff --git a/public/images/headface/17.gif b/public/images/headface/17.gif new file mode 100644 index 0000000..6f8846e Binary files /dev/null and b/public/images/headface/17.gif differ diff --git a/public/images/headface/178.gif b/public/images/headface/178.gif new file mode 100644 index 0000000..0d870fb Binary files /dev/null and b/public/images/headface/178.gif differ diff --git a/public/images/headface/18.GIF b/public/images/headface/18.GIF new file mode 100644 index 0000000..1ddc871 Binary files /dev/null and b/public/images/headface/18.GIF differ diff --git a/public/images/headface/183.gif b/public/images/headface/183.gif new file mode 100644 index 0000000..ab43bf8 Binary files /dev/null and b/public/images/headface/183.gif differ diff --git a/public/images/headface/187.gif b/public/images/headface/187.gif new file mode 100644 index 0000000..fb54e53 Binary files /dev/null and b/public/images/headface/187.gif differ diff --git a/public/images/headface/188.gif b/public/images/headface/188.gif new file mode 100644 index 0000000..77af134 Binary files /dev/null and b/public/images/headface/188.gif differ diff --git a/public/images/headface/19.GIF b/public/images/headface/19.GIF new file mode 100644 index 0000000..3dc0292 Binary files /dev/null and b/public/images/headface/19.GIF differ diff --git a/public/images/headface/195.gif b/public/images/headface/195.gif new file mode 100644 index 0000000..10d74ea Binary files /dev/null and b/public/images/headface/195.gif differ diff --git a/public/images/headface/2.GIF b/public/images/headface/2.GIF new file mode 100644 index 0000000..32b7e19 Binary files /dev/null and b/public/images/headface/2.GIF differ diff --git a/public/images/headface/20.GIF b/public/images/headface/20.GIF new file mode 100644 index 0000000..e600f8c Binary files /dev/null and b/public/images/headface/20.GIF differ diff --git a/public/images/headface/200.gif b/public/images/headface/200.gif new file mode 100644 index 0000000..6d406d3 Binary files /dev/null and b/public/images/headface/200.gif differ diff --git a/public/images/headface/20001.GIF b/public/images/headface/20001.GIF new file mode 100644 index 0000000..8105108 Binary files /dev/null and b/public/images/headface/20001.GIF differ diff --git a/public/images/headface/20002.GIF b/public/images/headface/20002.GIF new file mode 100644 index 0000000..393ca85 Binary files /dev/null and b/public/images/headface/20002.GIF differ diff --git a/public/images/headface/20003.GIF b/public/images/headface/20003.GIF new file mode 100644 index 0000000..ffc7397 Binary files /dev/null and b/public/images/headface/20003.GIF differ diff --git a/public/images/headface/20004.GIF b/public/images/headface/20004.GIF new file mode 100644 index 0000000..8fa8332 Binary files /dev/null and b/public/images/headface/20004.GIF differ diff --git a/public/images/headface/20005.GIF b/public/images/headface/20005.GIF new file mode 100644 index 0000000..c1a6e91 Binary files /dev/null and b/public/images/headface/20005.GIF differ diff --git a/public/images/headface/20006.GIF b/public/images/headface/20006.GIF new file mode 100644 index 0000000..4b950f8 Binary files /dev/null and b/public/images/headface/20006.GIF differ diff --git a/public/images/headface/20007.GIF b/public/images/headface/20007.GIF new file mode 100644 index 0000000..18b3cba Binary files /dev/null and b/public/images/headface/20007.GIF differ diff --git a/public/images/headface/20009.GIF b/public/images/headface/20009.GIF new file mode 100644 index 0000000..bb81ccd Binary files /dev/null and b/public/images/headface/20009.GIF differ diff --git a/public/images/headface/20012.GIF b/public/images/headface/20012.GIF new file mode 100644 index 0000000..0c3763f Binary files /dev/null and b/public/images/headface/20012.GIF differ diff --git a/public/images/headface/20013.GIF b/public/images/headface/20013.GIF new file mode 100644 index 0000000..ea7d106 Binary files /dev/null and b/public/images/headface/20013.GIF differ diff --git a/public/images/headface/20014.GIF b/public/images/headface/20014.GIF new file mode 100644 index 0000000..e421a8f Binary files /dev/null and b/public/images/headface/20014.GIF differ diff --git a/public/images/headface/20015.GIF b/public/images/headface/20015.GIF new file mode 100644 index 0000000..eb56b35 Binary files /dev/null and b/public/images/headface/20015.GIF differ diff --git a/public/images/headface/20016.GIF b/public/images/headface/20016.GIF new file mode 100644 index 0000000..5e12550 Binary files /dev/null and b/public/images/headface/20016.GIF differ diff --git a/public/images/headface/20017.GIF b/public/images/headface/20017.GIF new file mode 100644 index 0000000..a1cd19c Binary files /dev/null and b/public/images/headface/20017.GIF differ diff --git a/public/images/headface/20018.GIF b/public/images/headface/20018.GIF new file mode 100644 index 0000000..5c2b7e9 Binary files /dev/null and b/public/images/headface/20018.GIF differ diff --git a/public/images/headface/20019.GIF b/public/images/headface/20019.GIF new file mode 100644 index 0000000..75ef420 Binary files /dev/null and b/public/images/headface/20019.GIF differ diff --git a/public/images/headface/20020.GIF b/public/images/headface/20020.GIF new file mode 100644 index 0000000..1abf18e Binary files /dev/null and b/public/images/headface/20020.GIF differ diff --git a/public/images/headface/20021.GIF b/public/images/headface/20021.GIF new file mode 100644 index 0000000..7eaeaf6 Binary files /dev/null and b/public/images/headface/20021.GIF differ diff --git a/public/images/headface/20022.GIF b/public/images/headface/20022.GIF new file mode 100644 index 0000000..2a97e79 Binary files /dev/null and b/public/images/headface/20022.GIF differ diff --git a/public/images/headface/20023.GIF b/public/images/headface/20023.GIF new file mode 100644 index 0000000..e6757da Binary files /dev/null and b/public/images/headface/20023.GIF differ diff --git a/public/images/headface/20025.GIF b/public/images/headface/20025.GIF new file mode 100644 index 0000000..d4f358f Binary files /dev/null and b/public/images/headface/20025.GIF differ diff --git a/public/images/headface/20027.GIF b/public/images/headface/20027.GIF new file mode 100644 index 0000000..30f91b5 Binary files /dev/null and b/public/images/headface/20027.GIF differ diff --git a/public/images/headface/20028.GIF b/public/images/headface/20028.GIF new file mode 100644 index 0000000..0a82028 Binary files /dev/null and b/public/images/headface/20028.GIF differ diff --git a/public/images/headface/20029.GIF b/public/images/headface/20029.GIF new file mode 100644 index 0000000..8839f72 Binary files /dev/null and b/public/images/headface/20029.GIF differ diff --git a/public/images/headface/20030.GIF b/public/images/headface/20030.GIF new file mode 100644 index 0000000..baa4a5b Binary files /dev/null and b/public/images/headface/20030.GIF differ diff --git a/public/images/headface/20034.GIF b/public/images/headface/20034.GIF new file mode 100644 index 0000000..4046155 Binary files /dev/null and b/public/images/headface/20034.GIF differ diff --git a/public/images/headface/20035.GIF b/public/images/headface/20035.GIF new file mode 100644 index 0000000..47212dd Binary files /dev/null and b/public/images/headface/20035.GIF differ diff --git a/public/images/headface/20036.GIF b/public/images/headface/20036.GIF new file mode 100644 index 0000000..f8ad1cb Binary files /dev/null and b/public/images/headface/20036.GIF differ diff --git a/public/images/headface/20037.GIF b/public/images/headface/20037.GIF new file mode 100644 index 0000000..589d3af Binary files /dev/null and b/public/images/headface/20037.GIF differ diff --git a/public/images/headface/20038.GIF b/public/images/headface/20038.GIF new file mode 100644 index 0000000..db06ee1 Binary files /dev/null and b/public/images/headface/20038.GIF differ diff --git a/public/images/headface/20039.GIF b/public/images/headface/20039.GIF new file mode 100644 index 0000000..b913948 Binary files /dev/null and b/public/images/headface/20039.GIF differ diff --git a/public/images/headface/20040.GIF b/public/images/headface/20040.GIF new file mode 100644 index 0000000..a806917 Binary files /dev/null and b/public/images/headface/20040.GIF differ diff --git a/public/images/headface/20041.GIF b/public/images/headface/20041.GIF new file mode 100644 index 0000000..d0fe849 Binary files /dev/null and b/public/images/headface/20041.GIF differ diff --git a/public/images/headface/20042.GIF b/public/images/headface/20042.GIF new file mode 100644 index 0000000..c5ed4ab Binary files /dev/null and b/public/images/headface/20042.GIF differ diff --git a/public/images/headface/20043.GIF b/public/images/headface/20043.GIF new file mode 100644 index 0000000..2bfa221 Binary files /dev/null and b/public/images/headface/20043.GIF differ diff --git a/public/images/headface/20044.GIF b/public/images/headface/20044.GIF new file mode 100644 index 0000000..38047eb Binary files /dev/null and b/public/images/headface/20044.GIF differ diff --git a/public/images/headface/20045.GIF b/public/images/headface/20045.GIF new file mode 100644 index 0000000..e899352 Binary files /dev/null and b/public/images/headface/20045.GIF differ diff --git a/public/images/headface/20046.GIF b/public/images/headface/20046.GIF new file mode 100644 index 0000000..c9335ae Binary files /dev/null and b/public/images/headface/20046.GIF differ diff --git a/public/images/headface/20047.GIF b/public/images/headface/20047.GIF new file mode 100644 index 0000000..73290ec Binary files /dev/null and b/public/images/headface/20047.GIF differ diff --git a/public/images/headface/20048.GIF b/public/images/headface/20048.GIF new file mode 100644 index 0000000..44df8bd Binary files /dev/null and b/public/images/headface/20048.GIF differ diff --git a/public/images/headface/20049.GIF b/public/images/headface/20049.GIF new file mode 100644 index 0000000..8a7daa3 Binary files /dev/null and b/public/images/headface/20049.GIF differ diff --git a/public/images/headface/20050.GIF b/public/images/headface/20050.GIF new file mode 100644 index 0000000..05c7a84 Binary files /dev/null and b/public/images/headface/20050.GIF differ diff --git a/public/images/headface/20051.GIF b/public/images/headface/20051.GIF new file mode 100644 index 0000000..eb31012 Binary files /dev/null and b/public/images/headface/20051.GIF differ diff --git a/public/images/headface/20053.GIF b/public/images/headface/20053.GIF new file mode 100644 index 0000000..eb32ba4 Binary files /dev/null and b/public/images/headface/20053.GIF differ diff --git a/public/images/headface/20054.GIF b/public/images/headface/20054.GIF new file mode 100644 index 0000000..c4e8dd0 Binary files /dev/null and b/public/images/headface/20054.GIF differ diff --git a/public/images/headface/20055.GIF b/public/images/headface/20055.GIF new file mode 100644 index 0000000..be07426 Binary files /dev/null and b/public/images/headface/20055.GIF differ diff --git a/public/images/headface/205.gif b/public/images/headface/205.gif new file mode 100644 index 0000000..3fc4bfc Binary files /dev/null and b/public/images/headface/205.gif differ diff --git a/public/images/headface/207.gif b/public/images/headface/207.gif new file mode 100644 index 0000000..97b951f Binary files /dev/null and b/public/images/headface/207.gif differ diff --git a/public/images/headface/21.GIF b/public/images/headface/21.GIF new file mode 100644 index 0000000..b15b3fc Binary files /dev/null and b/public/images/headface/21.GIF differ diff --git a/public/images/headface/212.gif b/public/images/headface/212.gif new file mode 100644 index 0000000..6f07ef1 Binary files /dev/null and b/public/images/headface/212.gif differ diff --git a/public/images/headface/213.gif b/public/images/headface/213.gif new file mode 100644 index 0000000..8a20d9f Binary files /dev/null and b/public/images/headface/213.gif differ diff --git a/public/images/headface/22.gif b/public/images/headface/22.gif new file mode 100644 index 0000000..9ddfa4b Binary files /dev/null and b/public/images/headface/22.gif differ diff --git a/public/images/headface/222.gif b/public/images/headface/222.gif new file mode 100644 index 0000000..ea02479 Binary files /dev/null and b/public/images/headface/222.gif differ diff --git a/public/images/headface/224.gif b/public/images/headface/224.gif new file mode 100644 index 0000000..db12536 Binary files /dev/null and b/public/images/headface/224.gif differ diff --git a/public/images/headface/225.gif b/public/images/headface/225.gif new file mode 100644 index 0000000..eda9805 Binary files /dev/null and b/public/images/headface/225.gif differ diff --git a/public/images/headface/227.gif b/public/images/headface/227.gif new file mode 100644 index 0000000..b33ef66 Binary files /dev/null and b/public/images/headface/227.gif differ diff --git a/public/images/headface/23.gif b/public/images/headface/23.gif new file mode 100644 index 0000000..5da8100 Binary files /dev/null and b/public/images/headface/23.gif differ diff --git a/public/images/headface/24.gif b/public/images/headface/24.gif new file mode 100644 index 0000000..902e5d3 Binary files /dev/null and b/public/images/headface/24.gif differ diff --git a/public/images/headface/2414.gif b/public/images/headface/2414.gif new file mode 100644 index 0000000..12f5a50 Binary files /dev/null and b/public/images/headface/2414.gif differ diff --git a/public/images/headface/25.gif b/public/images/headface/25.gif new file mode 100644 index 0000000..2c4a34b Binary files /dev/null and b/public/images/headface/25.gif differ diff --git a/public/images/headface/26.gif b/public/images/headface/26.gif new file mode 100644 index 0000000..6830914 Binary files /dev/null and b/public/images/headface/26.gif differ diff --git a/public/images/headface/27.gif b/public/images/headface/27.gif new file mode 100644 index 0000000..0cf59db Binary files /dev/null and b/public/images/headface/27.gif differ diff --git a/public/images/headface/28.gif b/public/images/headface/28.gif new file mode 100644 index 0000000..156abc8 Binary files /dev/null and b/public/images/headface/28.gif differ diff --git a/public/images/headface/29.gif b/public/images/headface/29.gif new file mode 100644 index 0000000..dd474d6 Binary files /dev/null and b/public/images/headface/29.gif differ diff --git a/public/images/headface/3.GIF b/public/images/headface/3.GIF new file mode 100644 index 0000000..b39e618 Binary files /dev/null and b/public/images/headface/3.GIF differ diff --git a/public/images/headface/30.gif b/public/images/headface/30.gif new file mode 100644 index 0000000..82ed44e Binary files /dev/null and b/public/images/headface/30.gif differ diff --git a/public/images/headface/30001.GIF b/public/images/headface/30001.GIF new file mode 100644 index 0000000..adabf03 Binary files /dev/null and b/public/images/headface/30001.GIF differ diff --git a/public/images/headface/30002.GIF b/public/images/headface/30002.GIF new file mode 100644 index 0000000..716d92a Binary files /dev/null and b/public/images/headface/30002.GIF differ diff --git a/public/images/headface/30003.GIF b/public/images/headface/30003.GIF new file mode 100644 index 0000000..f356494 Binary files /dev/null and b/public/images/headface/30003.GIF differ diff --git a/public/images/headface/30004.GIF b/public/images/headface/30004.GIF new file mode 100644 index 0000000..509be00 Binary files /dev/null and b/public/images/headface/30004.GIF differ diff --git a/public/images/headface/30005.GIF b/public/images/headface/30005.GIF new file mode 100644 index 0000000..d0c4432 Binary files /dev/null and b/public/images/headface/30005.GIF differ diff --git a/public/images/headface/30006.GIF b/public/images/headface/30006.GIF new file mode 100644 index 0000000..e56b608 Binary files /dev/null and b/public/images/headface/30006.GIF differ diff --git a/public/images/headface/30007.GIF b/public/images/headface/30007.GIF new file mode 100644 index 0000000..272d0e2 Binary files /dev/null and b/public/images/headface/30007.GIF differ diff --git a/public/images/headface/30008.GIF b/public/images/headface/30008.GIF new file mode 100644 index 0000000..e463372 Binary files /dev/null and b/public/images/headface/30008.GIF differ diff --git a/public/images/headface/30009.GIF b/public/images/headface/30009.GIF new file mode 100644 index 0000000..5398687 Binary files /dev/null and b/public/images/headface/30009.GIF differ diff --git a/public/images/headface/30010.GIF b/public/images/headface/30010.GIF new file mode 100644 index 0000000..8c3dadf Binary files /dev/null and b/public/images/headface/30010.GIF differ diff --git a/public/images/headface/30012.GIF b/public/images/headface/30012.GIF new file mode 100644 index 0000000..d3c9937 Binary files /dev/null and b/public/images/headface/30012.GIF differ diff --git a/public/images/headface/30013.GIF b/public/images/headface/30013.GIF new file mode 100644 index 0000000..627a4f6 Binary files /dev/null and b/public/images/headface/30013.GIF differ diff --git a/public/images/headface/30014.GIF b/public/images/headface/30014.GIF new file mode 100644 index 0000000..8fa9380 Binary files /dev/null and b/public/images/headface/30014.GIF differ diff --git a/public/images/headface/30015.GIF b/public/images/headface/30015.GIF new file mode 100644 index 0000000..471ad19 Binary files /dev/null and b/public/images/headface/30015.GIF differ diff --git a/public/images/headface/30016.GIF b/public/images/headface/30016.GIF new file mode 100644 index 0000000..d403b27 Binary files /dev/null and b/public/images/headface/30016.GIF differ diff --git a/public/images/headface/30019.GIF b/public/images/headface/30019.GIF new file mode 100644 index 0000000..d11d9c8 Binary files /dev/null and b/public/images/headface/30019.GIF differ diff --git a/public/images/headface/30020.GIF b/public/images/headface/30020.GIF new file mode 100644 index 0000000..9365fc3 Binary files /dev/null and b/public/images/headface/30020.GIF differ diff --git a/public/images/headface/30021.GIF b/public/images/headface/30021.GIF new file mode 100644 index 0000000..00fe6ad Binary files /dev/null and b/public/images/headface/30021.GIF differ diff --git a/public/images/headface/30022.GIF b/public/images/headface/30022.GIF new file mode 100644 index 0000000..323de56 Binary files /dev/null and b/public/images/headface/30022.GIF differ diff --git a/public/images/headface/30023.GIF b/public/images/headface/30023.GIF new file mode 100644 index 0000000..fe2694b Binary files /dev/null and b/public/images/headface/30023.GIF differ diff --git a/public/images/headface/30024.GIF b/public/images/headface/30024.GIF new file mode 100644 index 0000000..4e74376 Binary files /dev/null and b/public/images/headface/30024.GIF differ diff --git a/public/images/headface/30025.GIF b/public/images/headface/30025.GIF new file mode 100644 index 0000000..ae78e4f Binary files /dev/null and b/public/images/headface/30025.GIF differ diff --git a/public/images/headface/30026.GIF b/public/images/headface/30026.GIF new file mode 100644 index 0000000..a37e876 Binary files /dev/null and b/public/images/headface/30026.GIF differ diff --git a/public/images/headface/30028.GIF b/public/images/headface/30028.GIF new file mode 100644 index 0000000..c351034 Binary files /dev/null and b/public/images/headface/30028.GIF differ diff --git a/public/images/headface/30029.GIF b/public/images/headface/30029.GIF new file mode 100644 index 0000000..cb4e5ff Binary files /dev/null and b/public/images/headface/30029.GIF differ diff --git a/public/images/headface/30030.GIF b/public/images/headface/30030.GIF new file mode 100644 index 0000000..a9f622f Binary files /dev/null and b/public/images/headface/30030.GIF differ diff --git a/public/images/headface/30031.GIF b/public/images/headface/30031.GIF new file mode 100644 index 0000000..efd974a Binary files /dev/null and b/public/images/headface/30031.GIF differ diff --git a/public/images/headface/30032.GIF b/public/images/headface/30032.GIF new file mode 100644 index 0000000..c3ead14 Binary files /dev/null and b/public/images/headface/30032.GIF differ diff --git a/public/images/headface/30033.GIF b/public/images/headface/30033.GIF new file mode 100644 index 0000000..f2f7463 Binary files /dev/null and b/public/images/headface/30033.GIF differ diff --git a/public/images/headface/30034.GIF b/public/images/headface/30034.GIF new file mode 100644 index 0000000..bd5e508 Binary files /dev/null and b/public/images/headface/30034.GIF differ diff --git a/public/images/headface/30035.GIF b/public/images/headface/30035.GIF new file mode 100644 index 0000000..e61c159 Binary files /dev/null and b/public/images/headface/30035.GIF differ diff --git a/public/images/headface/30036.GIF b/public/images/headface/30036.GIF new file mode 100644 index 0000000..b795377 Binary files /dev/null and b/public/images/headface/30036.GIF differ diff --git a/public/images/headface/30037.GIF b/public/images/headface/30037.GIF new file mode 100644 index 0000000..7dae717 Binary files /dev/null and b/public/images/headface/30037.GIF differ diff --git a/public/images/headface/30038.GIF b/public/images/headface/30038.GIF new file mode 100644 index 0000000..db15381 Binary files /dev/null and b/public/images/headface/30038.GIF differ diff --git a/public/images/headface/30040.GIF b/public/images/headface/30040.GIF new file mode 100644 index 0000000..c1c9332 Binary files /dev/null and b/public/images/headface/30040.GIF differ diff --git a/public/images/headface/30041.GIF b/public/images/headface/30041.GIF new file mode 100644 index 0000000..16c251b Binary files /dev/null and b/public/images/headface/30041.GIF differ diff --git a/public/images/headface/30042.GIF b/public/images/headface/30042.GIF new file mode 100644 index 0000000..e69e09e Binary files /dev/null and b/public/images/headface/30042.GIF differ diff --git a/public/images/headface/30044.GIF b/public/images/headface/30044.GIF new file mode 100644 index 0000000..0c5cbd5 Binary files /dev/null and b/public/images/headface/30044.GIF differ diff --git a/public/images/headface/30045.GIF b/public/images/headface/30045.GIF new file mode 100644 index 0000000..238e8e8 Binary files /dev/null and b/public/images/headface/30045.GIF differ diff --git a/public/images/headface/30046.GIF b/public/images/headface/30046.GIF new file mode 100644 index 0000000..d0c4947 Binary files /dev/null and b/public/images/headface/30046.GIF differ diff --git a/public/images/headface/30047.GIF b/public/images/headface/30047.GIF new file mode 100644 index 0000000..2363fc5 Binary files /dev/null and b/public/images/headface/30047.GIF differ diff --git a/public/images/headface/30048.GIF b/public/images/headface/30048.GIF new file mode 100644 index 0000000..609f28b Binary files /dev/null and b/public/images/headface/30048.GIF differ diff --git a/public/images/headface/30049.GIF b/public/images/headface/30049.GIF new file mode 100644 index 0000000..a1aa99d Binary files /dev/null and b/public/images/headface/30049.GIF differ diff --git a/public/images/headface/30050.GIF b/public/images/headface/30050.GIF new file mode 100644 index 0000000..b0bcf5b Binary files /dev/null and b/public/images/headface/30050.GIF differ diff --git a/public/images/headface/30051.GIF b/public/images/headface/30051.GIF new file mode 100644 index 0000000..a8dbdc4 Binary files /dev/null and b/public/images/headface/30051.GIF differ diff --git a/public/images/headface/30053.GIF b/public/images/headface/30053.GIF new file mode 100644 index 0000000..eb70f2e Binary files /dev/null and b/public/images/headface/30053.GIF differ diff --git a/public/images/headface/30054.GIF b/public/images/headface/30054.GIF new file mode 100644 index 0000000..5613184 Binary files /dev/null and b/public/images/headface/30054.GIF differ diff --git a/public/images/headface/30055.GIF b/public/images/headface/30055.GIF new file mode 100644 index 0000000..3f61406 Binary files /dev/null and b/public/images/headface/30055.GIF differ diff --git a/public/images/headface/30057.GIF b/public/images/headface/30057.GIF new file mode 100644 index 0000000..5323ded Binary files /dev/null and b/public/images/headface/30057.GIF differ diff --git a/public/images/headface/30058.GIF b/public/images/headface/30058.GIF new file mode 100644 index 0000000..6f36a32 Binary files /dev/null and b/public/images/headface/30058.GIF differ diff --git a/public/images/headface/30060.GIF b/public/images/headface/30060.GIF new file mode 100644 index 0000000..ebdd4c7 Binary files /dev/null and b/public/images/headface/30060.GIF differ diff --git a/public/images/headface/30062.GIF b/public/images/headface/30062.GIF new file mode 100644 index 0000000..cb956cb Binary files /dev/null and b/public/images/headface/30062.GIF differ diff --git a/public/images/headface/30063.GIF b/public/images/headface/30063.GIF new file mode 100644 index 0000000..80a4163 Binary files /dev/null and b/public/images/headface/30063.GIF differ diff --git a/public/images/headface/30064.GIF b/public/images/headface/30064.GIF new file mode 100644 index 0000000..cf5b0c3 Binary files /dev/null and b/public/images/headface/30064.GIF differ diff --git a/public/images/headface/31.GIF b/public/images/headface/31.GIF new file mode 100644 index 0000000..ae4a1b6 Binary files /dev/null and b/public/images/headface/31.GIF differ diff --git a/public/images/headface/32.gif b/public/images/headface/32.gif new file mode 100644 index 0000000..611dfb9 Binary files /dev/null and b/public/images/headface/32.gif differ diff --git a/public/images/headface/33.gif b/public/images/headface/33.gif new file mode 100644 index 0000000..18615cd Binary files /dev/null and b/public/images/headface/33.gif differ diff --git a/public/images/headface/34.gif b/public/images/headface/34.gif new file mode 100644 index 0000000..712c11a Binary files /dev/null and b/public/images/headface/34.gif differ diff --git a/public/images/headface/35.gif b/public/images/headface/35.gif new file mode 100644 index 0000000..695e767 Binary files /dev/null and b/public/images/headface/35.gif differ diff --git a/public/images/headface/36.gif b/public/images/headface/36.gif new file mode 100644 index 0000000..2ab5017 Binary files /dev/null and b/public/images/headface/36.gif differ diff --git a/public/images/headface/37.gif b/public/images/headface/37.gif new file mode 100644 index 0000000..af3acae Binary files /dev/null and b/public/images/headface/37.gif differ diff --git a/public/images/headface/38.gif b/public/images/headface/38.gif new file mode 100644 index 0000000..5f2c059 Binary files /dev/null and b/public/images/headface/38.gif differ diff --git a/public/images/headface/39.gif b/public/images/headface/39.gif new file mode 100644 index 0000000..b309acc Binary files /dev/null and b/public/images/headface/39.gif differ diff --git a/public/images/headface/4.GIF b/public/images/headface/4.GIF new file mode 100644 index 0000000..d098031 Binary files /dev/null and b/public/images/headface/4.GIF differ diff --git a/public/images/headface/40.gif b/public/images/headface/40.gif new file mode 100644 index 0000000..00460c8 Binary files /dev/null and b/public/images/headface/40.gif differ diff --git a/public/images/headface/40001.GIF b/public/images/headface/40001.GIF new file mode 100644 index 0000000..0a52216 Binary files /dev/null and b/public/images/headface/40001.GIF differ diff --git a/public/images/headface/40003.GIF b/public/images/headface/40003.GIF new file mode 100644 index 0000000..2e7620a Binary files /dev/null and b/public/images/headface/40003.GIF differ diff --git a/public/images/headface/40005.GIF b/public/images/headface/40005.GIF new file mode 100644 index 0000000..05ad6d9 Binary files /dev/null and b/public/images/headface/40005.GIF differ diff --git a/public/images/headface/40006.GIF b/public/images/headface/40006.GIF new file mode 100644 index 0000000..0eadb76 Binary files /dev/null and b/public/images/headface/40006.GIF differ diff --git a/public/images/headface/40007.GIF b/public/images/headface/40007.GIF new file mode 100644 index 0000000..8927164 Binary files /dev/null and b/public/images/headface/40007.GIF differ diff --git a/public/images/headface/40008.GIF b/public/images/headface/40008.GIF new file mode 100644 index 0000000..cf6a500 Binary files /dev/null and b/public/images/headface/40008.GIF differ diff --git a/public/images/headface/40009.GIF b/public/images/headface/40009.GIF new file mode 100644 index 0000000..52a21c3 Binary files /dev/null and b/public/images/headface/40009.GIF differ diff --git a/public/images/headface/40010.GIF b/public/images/headface/40010.GIF new file mode 100644 index 0000000..3bb5457 Binary files /dev/null and b/public/images/headface/40010.GIF differ diff --git a/public/images/headface/40011.GIF b/public/images/headface/40011.GIF new file mode 100644 index 0000000..0cc1e85 Binary files /dev/null and b/public/images/headface/40011.GIF differ diff --git a/public/images/headface/40013.GIF b/public/images/headface/40013.GIF new file mode 100644 index 0000000..143793d Binary files /dev/null and b/public/images/headface/40013.GIF differ diff --git a/public/images/headface/40021.GIF b/public/images/headface/40021.GIF new file mode 100644 index 0000000..ea710e7 Binary files /dev/null and b/public/images/headface/40021.GIF differ diff --git a/public/images/headface/40022.GIF b/public/images/headface/40022.GIF new file mode 100644 index 0000000..1a99b09 Binary files /dev/null and b/public/images/headface/40022.GIF differ diff --git a/public/images/headface/40025.GIF b/public/images/headface/40025.GIF new file mode 100644 index 0000000..8d269ba Binary files /dev/null and b/public/images/headface/40025.GIF differ diff --git a/public/images/headface/40035.GIF b/public/images/headface/40035.GIF new file mode 100644 index 0000000..61fccd3 Binary files /dev/null and b/public/images/headface/40035.GIF differ diff --git a/public/images/headface/40036.GIF b/public/images/headface/40036.GIF new file mode 100644 index 0000000..d254a00 Binary files /dev/null and b/public/images/headface/40036.GIF differ diff --git a/public/images/headface/40037.GIF b/public/images/headface/40037.GIF new file mode 100644 index 0000000..8ba2c5d Binary files /dev/null and b/public/images/headface/40037.GIF differ diff --git a/public/images/headface/40038.GIF b/public/images/headface/40038.GIF new file mode 100644 index 0000000..8139187 Binary files /dev/null and b/public/images/headface/40038.GIF differ diff --git a/public/images/headface/40039.GIF b/public/images/headface/40039.GIF new file mode 100644 index 0000000..208dff4 Binary files /dev/null and b/public/images/headface/40039.GIF differ diff --git a/public/images/headface/40040.GIF b/public/images/headface/40040.GIF new file mode 100644 index 0000000..9b589f4 Binary files /dev/null and b/public/images/headface/40040.GIF differ diff --git a/public/images/headface/40041.GIF b/public/images/headface/40041.GIF new file mode 100644 index 0000000..43c09d0 Binary files /dev/null and b/public/images/headface/40041.GIF differ diff --git a/public/images/headface/40043.GIF b/public/images/headface/40043.GIF new file mode 100644 index 0000000..7d69a19 Binary files /dev/null and b/public/images/headface/40043.GIF differ diff --git a/public/images/headface/40044.GIF b/public/images/headface/40044.GIF new file mode 100644 index 0000000..b783b24 Binary files /dev/null and b/public/images/headface/40044.GIF differ diff --git a/public/images/headface/40046.GIF b/public/images/headface/40046.GIF new file mode 100644 index 0000000..c6d60ec Binary files /dev/null and b/public/images/headface/40046.GIF differ diff --git a/public/images/headface/40051.GIF b/public/images/headface/40051.GIF new file mode 100644 index 0000000..c60e759 Binary files /dev/null and b/public/images/headface/40051.GIF differ diff --git a/public/images/headface/40053.GIF b/public/images/headface/40053.GIF new file mode 100644 index 0000000..f2d36e9 Binary files /dev/null and b/public/images/headface/40053.GIF differ diff --git a/public/images/headface/40054.GIF b/public/images/headface/40054.GIF new file mode 100644 index 0000000..912c646 Binary files /dev/null and b/public/images/headface/40054.GIF differ diff --git a/public/images/headface/40055.GIF b/public/images/headface/40055.GIF new file mode 100644 index 0000000..29f4337 Binary files /dev/null and b/public/images/headface/40055.GIF differ diff --git a/public/images/headface/40056.GIF b/public/images/headface/40056.GIF new file mode 100644 index 0000000..a87d419 Binary files /dev/null and b/public/images/headface/40056.GIF differ diff --git a/public/images/headface/40059.GIF b/public/images/headface/40059.GIF new file mode 100644 index 0000000..0859df9 Binary files /dev/null and b/public/images/headface/40059.GIF differ diff --git a/public/images/headface/40061.GIF b/public/images/headface/40061.GIF new file mode 100644 index 0000000..0a86408 Binary files /dev/null and b/public/images/headface/40061.GIF differ diff --git a/public/images/headface/40062.GIF b/public/images/headface/40062.GIF new file mode 100644 index 0000000..c3fc447 Binary files /dev/null and b/public/images/headface/40062.GIF differ diff --git a/public/images/headface/4044.gif b/public/images/headface/4044.gif new file mode 100644 index 0000000..de71306 Binary files /dev/null and b/public/images/headface/4044.gif differ diff --git a/public/images/headface/41.GIF b/public/images/headface/41.GIF new file mode 100644 index 0000000..03469c4 Binary files /dev/null and b/public/images/headface/41.GIF differ diff --git a/public/images/headface/4121.gif b/public/images/headface/4121.gif new file mode 100644 index 0000000..e8345a9 Binary files /dev/null and b/public/images/headface/4121.gif differ diff --git a/public/images/headface/4141.gif b/public/images/headface/4141.gif new file mode 100644 index 0000000..3650832 Binary files /dev/null and b/public/images/headface/4141.gif differ diff --git a/public/images/headface/4143.gif b/public/images/headface/4143.gif new file mode 100644 index 0000000..e72e76c Binary files /dev/null and b/public/images/headface/4143.gif differ diff --git a/public/images/headface/42.GIF b/public/images/headface/42.GIF new file mode 100644 index 0000000..ea02479 Binary files /dev/null and b/public/images/headface/42.GIF differ diff --git a/public/images/headface/43.GIF b/public/images/headface/43.GIF new file mode 100644 index 0000000..f10ccb5 Binary files /dev/null and b/public/images/headface/43.GIF differ diff --git a/public/images/headface/44.GIF b/public/images/headface/44.GIF new file mode 100644 index 0000000..5148d85 Binary files /dev/null and b/public/images/headface/44.GIF differ diff --git a/public/images/headface/4411.gif b/public/images/headface/4411.gif new file mode 100644 index 0000000..21488e6 Binary files /dev/null and b/public/images/headface/4411.gif differ diff --git a/public/images/headface/45.GIF b/public/images/headface/45.GIF new file mode 100644 index 0000000..da1bd59 Binary files /dev/null and b/public/images/headface/45.GIF differ diff --git a/public/images/headface/4510.gif b/public/images/headface/4510.gif new file mode 100644 index 0000000..049876a Binary files /dev/null and b/public/images/headface/4510.gif differ diff --git a/public/images/headface/46.GIF b/public/images/headface/46.GIF new file mode 100644 index 0000000..3826587 Binary files /dev/null and b/public/images/headface/46.GIF differ diff --git a/public/images/headface/47.GIF b/public/images/headface/47.GIF new file mode 100644 index 0000000..493a15b Binary files /dev/null and b/public/images/headface/47.GIF differ diff --git a/public/images/headface/48.GIF b/public/images/headface/48.GIF new file mode 100644 index 0000000..2b82f48 Binary files /dev/null and b/public/images/headface/48.GIF differ diff --git a/public/images/headface/49.GIF b/public/images/headface/49.GIF new file mode 100644 index 0000000..a723838 Binary files /dev/null and b/public/images/headface/49.GIF differ diff --git a/public/images/headface/491.gif b/public/images/headface/491.gif new file mode 100644 index 0000000..7e7bc5e Binary files /dev/null and b/public/images/headface/491.gif differ diff --git a/public/images/headface/5.GIF b/public/images/headface/5.GIF new file mode 100644 index 0000000..5b55622 Binary files /dev/null and b/public/images/headface/5.GIF differ diff --git a/public/images/headface/50.GIF b/public/images/headface/50.GIF new file mode 100644 index 0000000..545fc90 Binary files /dev/null and b/public/images/headface/50.GIF differ diff --git a/public/images/headface/50001.GIF b/public/images/headface/50001.GIF new file mode 100644 index 0000000..04eafc3 Binary files /dev/null and b/public/images/headface/50001.GIF differ diff --git a/public/images/headface/51.GIF b/public/images/headface/51.GIF new file mode 100644 index 0000000..3dc0292 Binary files /dev/null and b/public/images/headface/51.GIF differ diff --git a/public/images/headface/52.GIF b/public/images/headface/52.GIF new file mode 100644 index 0000000..591bfa2 Binary files /dev/null and b/public/images/headface/52.GIF differ diff --git a/public/images/headface/53.GIF b/public/images/headface/53.GIF new file mode 100644 index 0000000..c9616b6 Binary files /dev/null and b/public/images/headface/53.GIF differ diff --git a/public/images/headface/54.GIF b/public/images/headface/54.GIF new file mode 100644 index 0000000..b3743b5 Binary files /dev/null and b/public/images/headface/54.GIF differ diff --git a/public/images/headface/5414.gif b/public/images/headface/5414.gif new file mode 100644 index 0000000..8eb16a1 Binary files /dev/null and b/public/images/headface/5414.gif differ diff --git a/public/images/headface/5415.gif b/public/images/headface/5415.gif new file mode 100644 index 0000000..148ed09 Binary files /dev/null and b/public/images/headface/5415.gif differ diff --git a/public/images/headface/55.GIF b/public/images/headface/55.GIF new file mode 100644 index 0000000..51f5dee Binary files /dev/null and b/public/images/headface/55.GIF differ diff --git a/public/images/headface/56.GIF b/public/images/headface/56.GIF new file mode 100644 index 0000000..e9c5acb Binary files /dev/null and b/public/images/headface/56.GIF differ diff --git a/public/images/headface/564.gif b/public/images/headface/564.gif new file mode 100644 index 0000000..8281a5b Binary files /dev/null and b/public/images/headface/564.gif differ diff --git a/public/images/headface/57.GIF b/public/images/headface/57.GIF new file mode 100644 index 0000000..94b0d21 Binary files /dev/null and b/public/images/headface/57.GIF differ diff --git a/public/images/headface/58.GIF b/public/images/headface/58.GIF new file mode 100644 index 0000000..f7c45c3 Binary files /dev/null and b/public/images/headface/58.GIF differ diff --git a/public/images/headface/59.GIF b/public/images/headface/59.GIF new file mode 100644 index 0000000..b1432f1 Binary files /dev/null and b/public/images/headface/59.GIF differ diff --git a/public/images/headface/6.gif b/public/images/headface/6.gif new file mode 100644 index 0000000..1a13856 Binary files /dev/null and b/public/images/headface/6.gif differ diff --git a/public/images/headface/60.GIF b/public/images/headface/60.GIF new file mode 100644 index 0000000..6ef4e43 Binary files /dev/null and b/public/images/headface/60.GIF differ diff --git a/public/images/headface/60001.GIF b/public/images/headface/60001.GIF new file mode 100644 index 0000000..677bfd8 Binary files /dev/null and b/public/images/headface/60001.GIF differ diff --git a/public/images/headface/60002.GIF b/public/images/headface/60002.GIF new file mode 100644 index 0000000..c45daae Binary files /dev/null and b/public/images/headface/60002.GIF differ diff --git a/public/images/headface/60003.GIF b/public/images/headface/60003.GIF new file mode 100644 index 0000000..75f9968 Binary files /dev/null and b/public/images/headface/60003.GIF differ diff --git a/public/images/headface/60004.GIF b/public/images/headface/60004.GIF new file mode 100644 index 0000000..2cc610f Binary files /dev/null and b/public/images/headface/60004.GIF differ diff --git a/public/images/headface/60005.GIF b/public/images/headface/60005.GIF new file mode 100644 index 0000000..d282b67 Binary files /dev/null and b/public/images/headface/60005.GIF differ diff --git a/public/images/headface/60006.GIF b/public/images/headface/60006.GIF new file mode 100644 index 0000000..a596843 Binary files /dev/null and b/public/images/headface/60006.GIF differ diff --git a/public/images/headface/60007.GIF b/public/images/headface/60007.GIF new file mode 100644 index 0000000..30c6a2a Binary files /dev/null and b/public/images/headface/60007.GIF differ diff --git a/public/images/headface/60008.GIF b/public/images/headface/60008.GIF new file mode 100644 index 0000000..32dca31 Binary files /dev/null and b/public/images/headface/60008.GIF differ diff --git a/public/images/headface/60009.GIF b/public/images/headface/60009.GIF new file mode 100644 index 0000000..a97771f Binary files /dev/null and b/public/images/headface/60009.GIF differ diff --git a/public/images/headface/60010.GIF b/public/images/headface/60010.GIF new file mode 100644 index 0000000..935591e Binary files /dev/null and b/public/images/headface/60010.GIF differ diff --git a/public/images/headface/60011.GIF b/public/images/headface/60011.GIF new file mode 100644 index 0000000..13126a1 Binary files /dev/null and b/public/images/headface/60011.GIF differ diff --git a/public/images/headface/60012.GIF b/public/images/headface/60012.GIF new file mode 100644 index 0000000..61f1d5d Binary files /dev/null and b/public/images/headface/60012.GIF differ diff --git a/public/images/headface/60013.GIF b/public/images/headface/60013.GIF new file mode 100644 index 0000000..c0417f6 Binary files /dev/null and b/public/images/headface/60013.GIF differ diff --git a/public/images/headface/60014.GIF b/public/images/headface/60014.GIF new file mode 100644 index 0000000..3d0cd75 Binary files /dev/null and b/public/images/headface/60014.GIF differ diff --git a/public/images/headface/60015.GIF b/public/images/headface/60015.GIF new file mode 100644 index 0000000..a27b8a1 Binary files /dev/null and b/public/images/headface/60015.GIF differ diff --git a/public/images/headface/60016.GIF b/public/images/headface/60016.GIF new file mode 100644 index 0000000..2456aa3 Binary files /dev/null and b/public/images/headface/60016.GIF differ diff --git a/public/images/headface/60017.GIF b/public/images/headface/60017.GIF new file mode 100644 index 0000000..01190ed Binary files /dev/null and b/public/images/headface/60017.GIF differ diff --git a/public/images/headface/60018.GIF b/public/images/headface/60018.GIF new file mode 100644 index 0000000..65a731d Binary files /dev/null and b/public/images/headface/60018.GIF differ diff --git a/public/images/headface/60019.GIF b/public/images/headface/60019.GIF new file mode 100644 index 0000000..2d3e696 Binary files /dev/null and b/public/images/headface/60019.GIF differ diff --git a/public/images/headface/60020.GIF b/public/images/headface/60020.GIF new file mode 100644 index 0000000..78cb68f Binary files /dev/null and b/public/images/headface/60020.GIF differ diff --git a/public/images/headface/60021.GIF b/public/images/headface/60021.GIF new file mode 100644 index 0000000..3fa12b3 Binary files /dev/null and b/public/images/headface/60021.GIF differ diff --git a/public/images/headface/60022.GIF b/public/images/headface/60022.GIF new file mode 100644 index 0000000..9e759a7 Binary files /dev/null and b/public/images/headface/60022.GIF differ diff --git a/public/images/headface/60023.GIF b/public/images/headface/60023.GIF new file mode 100644 index 0000000..2e87211 Binary files /dev/null and b/public/images/headface/60023.GIF differ diff --git a/public/images/headface/60024.GIF b/public/images/headface/60024.GIF new file mode 100644 index 0000000..04bdbab Binary files /dev/null and b/public/images/headface/60024.GIF differ diff --git a/public/images/headface/60025.GIF b/public/images/headface/60025.GIF new file mode 100644 index 0000000..4312630 Binary files /dev/null and b/public/images/headface/60025.GIF differ diff --git a/public/images/headface/60026.GIF b/public/images/headface/60026.GIF new file mode 100644 index 0000000..0f58265 Binary files /dev/null and b/public/images/headface/60026.GIF differ diff --git a/public/images/headface/60027.GIF b/public/images/headface/60027.GIF new file mode 100644 index 0000000..f6a6ed6 Binary files /dev/null and b/public/images/headface/60027.GIF differ diff --git a/public/images/headface/60028.GIF b/public/images/headface/60028.GIF new file mode 100644 index 0000000..c37348b Binary files /dev/null and b/public/images/headface/60028.GIF differ diff --git a/public/images/headface/60029.GIF b/public/images/headface/60029.GIF new file mode 100644 index 0000000..5982130 Binary files /dev/null and b/public/images/headface/60029.GIF differ diff --git a/public/images/headface/60030.GIF b/public/images/headface/60030.GIF new file mode 100644 index 0000000..dac7c16 Binary files /dev/null and b/public/images/headface/60030.GIF differ diff --git a/public/images/headface/60031.GIF b/public/images/headface/60031.GIF new file mode 100644 index 0000000..3df4e64 Binary files /dev/null and b/public/images/headface/60031.GIF differ diff --git a/public/images/headface/60032.GIF b/public/images/headface/60032.GIF new file mode 100644 index 0000000..edc808d Binary files /dev/null and b/public/images/headface/60032.GIF differ diff --git a/public/images/headface/60033.GIF b/public/images/headface/60033.GIF new file mode 100644 index 0000000..01698b9 Binary files /dev/null and b/public/images/headface/60033.GIF differ diff --git a/public/images/headface/60034.GIF b/public/images/headface/60034.GIF new file mode 100644 index 0000000..2ee8488 Binary files /dev/null and b/public/images/headface/60034.GIF differ diff --git a/public/images/headface/60035.GIF b/public/images/headface/60035.GIF new file mode 100644 index 0000000..f5ad0ad Binary files /dev/null and b/public/images/headface/60035.GIF differ diff --git a/public/images/headface/60036.GIF b/public/images/headface/60036.GIF new file mode 100644 index 0000000..4e7d1cf Binary files /dev/null and b/public/images/headface/60036.GIF differ diff --git a/public/images/headface/60037.GIF b/public/images/headface/60037.GIF new file mode 100644 index 0000000..fdebafc Binary files /dev/null and b/public/images/headface/60037.GIF differ diff --git a/public/images/headface/60038.GIF b/public/images/headface/60038.GIF new file mode 100644 index 0000000..c793f74 Binary files /dev/null and b/public/images/headface/60038.GIF differ diff --git a/public/images/headface/60039.GIF b/public/images/headface/60039.GIF new file mode 100644 index 0000000..11706c6 Binary files /dev/null and b/public/images/headface/60039.GIF differ diff --git a/public/images/headface/60040.GIF b/public/images/headface/60040.GIF new file mode 100644 index 0000000..2096870 Binary files /dev/null and b/public/images/headface/60040.GIF differ diff --git a/public/images/headface/60041.GIF b/public/images/headface/60041.GIF new file mode 100644 index 0000000..29ac4a7 Binary files /dev/null and b/public/images/headface/60041.GIF differ diff --git a/public/images/headface/60042.GIF b/public/images/headface/60042.GIF new file mode 100644 index 0000000..9defa28 Binary files /dev/null and b/public/images/headface/60042.GIF differ diff --git a/public/images/headface/60043.GIF b/public/images/headface/60043.GIF new file mode 100644 index 0000000..ede7fb4 Binary files /dev/null and b/public/images/headface/60043.GIF differ diff --git a/public/images/headface/60044.GIF b/public/images/headface/60044.GIF new file mode 100644 index 0000000..fb19813 Binary files /dev/null and b/public/images/headface/60044.GIF differ diff --git a/public/images/headface/60045.GIF b/public/images/headface/60045.GIF new file mode 100644 index 0000000..47cb905 Binary files /dev/null and b/public/images/headface/60045.GIF differ diff --git a/public/images/headface/60046.GIF b/public/images/headface/60046.GIF new file mode 100644 index 0000000..08d2fae Binary files /dev/null and b/public/images/headface/60046.GIF differ diff --git a/public/images/headface/60047.GIF b/public/images/headface/60047.GIF new file mode 100644 index 0000000..1b334b9 Binary files /dev/null and b/public/images/headface/60047.GIF differ diff --git a/public/images/headface/60048.GIF b/public/images/headface/60048.GIF new file mode 100644 index 0000000..a612185 Binary files /dev/null and b/public/images/headface/60048.GIF differ diff --git a/public/images/headface/60049.GIF b/public/images/headface/60049.GIF new file mode 100644 index 0000000..f45966e Binary files /dev/null and b/public/images/headface/60049.GIF differ diff --git a/public/images/headface/60050.GIF b/public/images/headface/60050.GIF new file mode 100644 index 0000000..383df3a Binary files /dev/null and b/public/images/headface/60050.GIF differ diff --git a/public/images/headface/60051.GIF b/public/images/headface/60051.GIF new file mode 100644 index 0000000..7fbbe24 Binary files /dev/null and b/public/images/headface/60051.GIF differ diff --git a/public/images/headface/60052.GIF b/public/images/headface/60052.GIF new file mode 100644 index 0000000..1b61742 Binary files /dev/null and b/public/images/headface/60052.GIF differ diff --git a/public/images/headface/60053.GIF b/public/images/headface/60053.GIF new file mode 100644 index 0000000..f5abb38 Binary files /dev/null and b/public/images/headface/60053.GIF differ diff --git a/public/images/headface/60054.GIF b/public/images/headface/60054.GIF new file mode 100644 index 0000000..4e4d60b Binary files /dev/null and b/public/images/headface/60054.GIF differ diff --git a/public/images/headface/60055.GIF b/public/images/headface/60055.GIF new file mode 100644 index 0000000..0e8f918 Binary files /dev/null and b/public/images/headface/60055.GIF differ diff --git a/public/images/headface/60056.GIF b/public/images/headface/60056.GIF new file mode 100644 index 0000000..42b720f Binary files /dev/null and b/public/images/headface/60056.GIF differ diff --git a/public/images/headface/60057.GIF b/public/images/headface/60057.GIF new file mode 100644 index 0000000..7e553a9 Binary files /dev/null and b/public/images/headface/60057.GIF differ diff --git a/public/images/headface/60058.GIF b/public/images/headface/60058.GIF new file mode 100644 index 0000000..843e3fe Binary files /dev/null and b/public/images/headface/60058.GIF differ diff --git a/public/images/headface/60059.GIF b/public/images/headface/60059.GIF new file mode 100644 index 0000000..c3b2ce3 Binary files /dev/null and b/public/images/headface/60059.GIF differ diff --git a/public/images/headface/60060.GIF b/public/images/headface/60060.GIF new file mode 100644 index 0000000..d7ba9f8 Binary files /dev/null and b/public/images/headface/60060.GIF differ diff --git a/public/images/headface/60061.GIF b/public/images/headface/60061.GIF new file mode 100644 index 0000000..f32741f Binary files /dev/null and b/public/images/headface/60061.GIF differ diff --git a/public/images/headface/60062.GIF b/public/images/headface/60062.GIF new file mode 100644 index 0000000..6b8fa43 Binary files /dev/null and b/public/images/headface/60062.GIF differ diff --git a/public/images/headface/60063.GIF b/public/images/headface/60063.GIF new file mode 100644 index 0000000..0e2f5d1 Binary files /dev/null and b/public/images/headface/60063.GIF differ diff --git a/public/images/headface/60064.GIF b/public/images/headface/60064.GIF new file mode 100644 index 0000000..06bf4d7 Binary files /dev/null and b/public/images/headface/60064.GIF differ diff --git a/public/images/headface/60065.GIF b/public/images/headface/60065.GIF new file mode 100644 index 0000000..60aff5c Binary files /dev/null and b/public/images/headface/60065.GIF differ diff --git a/public/images/headface/60066.GIF b/public/images/headface/60066.GIF new file mode 100644 index 0000000..ceb93ca Binary files /dev/null and b/public/images/headface/60066.GIF differ diff --git a/public/images/headface/61.GIF b/public/images/headface/61.GIF new file mode 100644 index 0000000..c2889a2 Binary files /dev/null and b/public/images/headface/61.GIF differ diff --git a/public/images/headface/62.GIF b/public/images/headface/62.GIF new file mode 100644 index 0000000..b15b3fc Binary files /dev/null and b/public/images/headface/62.GIF differ diff --git a/public/images/headface/63.GIF b/public/images/headface/63.GIF new file mode 100644 index 0000000..846f850 Binary files /dev/null and b/public/images/headface/63.GIF differ diff --git a/public/images/headface/64.GIF b/public/images/headface/64.GIF new file mode 100644 index 0000000..c26db62 Binary files /dev/null and b/public/images/headface/64.GIF differ diff --git a/public/images/headface/65.GIF b/public/images/headface/65.GIF new file mode 100644 index 0000000..b0a5fa6 Binary files /dev/null and b/public/images/headface/65.GIF differ diff --git a/public/images/headface/66.GIF b/public/images/headface/66.GIF new file mode 100644 index 0000000..e312864 Binary files /dev/null and b/public/images/headface/66.GIF differ diff --git a/public/images/headface/67.GIF b/public/images/headface/67.GIF new file mode 100644 index 0000000..6f8b50c Binary files /dev/null and b/public/images/headface/67.GIF differ diff --git a/public/images/headface/68.GIF b/public/images/headface/68.GIF new file mode 100644 index 0000000..ca6794b Binary files /dev/null and b/public/images/headface/68.GIF differ diff --git a/public/images/headface/69.GIF b/public/images/headface/69.GIF new file mode 100644 index 0000000..3aefd40 Binary files /dev/null and b/public/images/headface/69.GIF differ diff --git a/public/images/headface/7.gif b/public/images/headface/7.gif new file mode 100644 index 0000000..ffa32d4 Binary files /dev/null and b/public/images/headface/7.gif differ diff --git a/public/images/headface/70.GIF b/public/images/headface/70.GIF new file mode 100644 index 0000000..4659b8f Binary files /dev/null and b/public/images/headface/70.GIF differ diff --git a/public/images/headface/71.gif b/public/images/headface/71.gif new file mode 100644 index 0000000..e653069 Binary files /dev/null and b/public/images/headface/71.gif differ diff --git a/public/images/headface/72.GIF b/public/images/headface/72.GIF new file mode 100644 index 0000000..7dd061e Binary files /dev/null and b/public/images/headface/72.GIF differ diff --git a/public/images/headface/73.GIF b/public/images/headface/73.GIF new file mode 100644 index 0000000..850a90f Binary files /dev/null and b/public/images/headface/73.GIF differ diff --git a/public/images/headface/74.GIF b/public/images/headface/74.GIF new file mode 100644 index 0000000..7c4e70b Binary files /dev/null and b/public/images/headface/74.GIF differ diff --git a/public/images/headface/7417.gif b/public/images/headface/7417.gif new file mode 100644 index 0000000..781bca3 Binary files /dev/null and b/public/images/headface/7417.gif differ diff --git a/public/images/headface/75.GIF b/public/images/headface/75.GIF new file mode 100644 index 0000000..e6a6256 Binary files /dev/null and b/public/images/headface/75.GIF differ diff --git a/public/images/headface/76.GIF b/public/images/headface/76.GIF new file mode 100644 index 0000000..5a215a8 Binary files /dev/null and b/public/images/headface/76.GIF differ diff --git a/public/images/headface/77.GIF b/public/images/headface/77.GIF new file mode 100644 index 0000000..cf46c34 Binary files /dev/null and b/public/images/headface/77.GIF differ diff --git a/public/images/headface/78.gif b/public/images/headface/78.gif new file mode 100644 index 0000000..9d601eb Binary files /dev/null and b/public/images/headface/78.gif differ diff --git a/public/images/headface/79.gif b/public/images/headface/79.gif new file mode 100644 index 0000000..7c7da28 Binary files /dev/null and b/public/images/headface/79.gif differ diff --git a/public/images/headface/8.gif b/public/images/headface/8.gif new file mode 100644 index 0000000..3ab6c50 Binary files /dev/null and b/public/images/headface/8.gif differ diff --git a/public/images/headface/80.gif b/public/images/headface/80.gif new file mode 100644 index 0000000..9c9ffd8 Binary files /dev/null and b/public/images/headface/80.gif differ diff --git a/public/images/headface/81.gif b/public/images/headface/81.gif new file mode 100644 index 0000000..3ee5286 Binary files /dev/null and b/public/images/headface/81.gif differ diff --git a/public/images/headface/82.gif b/public/images/headface/82.gif new file mode 100644 index 0000000..00b4200 Binary files /dev/null and b/public/images/headface/82.gif differ diff --git a/public/images/headface/83.gif b/public/images/headface/83.gif new file mode 100644 index 0000000..74e18ec Binary files /dev/null and b/public/images/headface/83.gif differ diff --git a/public/images/headface/84.gif b/public/images/headface/84.gif new file mode 100644 index 0000000..883fa14 Binary files /dev/null and b/public/images/headface/84.gif differ diff --git a/public/images/headface/85.gif b/public/images/headface/85.gif new file mode 100644 index 0000000..74656c9 Binary files /dev/null and b/public/images/headface/85.gif differ diff --git a/public/images/headface/86.gif b/public/images/headface/86.gif new file mode 100644 index 0000000..d745316 Binary files /dev/null and b/public/images/headface/86.gif differ diff --git a/public/images/headface/87.gif b/public/images/headface/87.gif new file mode 100644 index 0000000..77dfcec Binary files /dev/null and b/public/images/headface/87.gif differ diff --git a/public/images/headface/88.gif b/public/images/headface/88.gif new file mode 100644 index 0000000..2957521 Binary files /dev/null and b/public/images/headface/88.gif differ diff --git a/public/images/headface/89.gif b/public/images/headface/89.gif new file mode 100644 index 0000000..777e115 Binary files /dev/null and b/public/images/headface/89.gif differ diff --git a/public/images/headface/9.gif b/public/images/headface/9.gif new file mode 100644 index 0000000..b950376 Binary files /dev/null and b/public/images/headface/9.gif differ diff --git a/public/images/headface/90.gif b/public/images/headface/90.gif new file mode 100644 index 0000000..67b2f09 Binary files /dev/null and b/public/images/headface/90.gif differ diff --git a/public/images/headface/900.gif b/public/images/headface/900.gif new file mode 100644 index 0000000..75d8fc3 Binary files /dev/null and b/public/images/headface/900.gif differ diff --git a/public/images/headface/9002.gif b/public/images/headface/9002.gif new file mode 100644 index 0000000..769b6be Binary files /dev/null and b/public/images/headface/9002.gif differ diff --git a/public/images/headface/9003.gif b/public/images/headface/9003.gif new file mode 100644 index 0000000..fabd599 Binary files /dev/null and b/public/images/headface/9003.gif differ diff --git a/public/images/headface/9004.gif b/public/images/headface/9004.gif new file mode 100644 index 0000000..5b46213 Binary files /dev/null and b/public/images/headface/9004.gif differ diff --git a/public/images/headface/9005.gif b/public/images/headface/9005.gif new file mode 100644 index 0000000..d398711 Binary files /dev/null and b/public/images/headface/9005.gif differ diff --git a/public/images/headface/9006.gif b/public/images/headface/9006.gif new file mode 100644 index 0000000..7608b6a Binary files /dev/null and b/public/images/headface/9006.gif differ diff --git a/public/images/headface/9007.gif b/public/images/headface/9007.gif new file mode 100644 index 0000000..a64e5c9 Binary files /dev/null and b/public/images/headface/9007.gif differ diff --git a/public/images/headface/9009.gif b/public/images/headface/9009.gif new file mode 100644 index 0000000..cf7dff8 Binary files /dev/null and b/public/images/headface/9009.gif differ diff --git a/public/images/headface/901.gif b/public/images/headface/901.gif new file mode 100644 index 0000000..b71e630 Binary files /dev/null and b/public/images/headface/901.gif differ diff --git a/public/images/headface/9011.gif b/public/images/headface/9011.gif new file mode 100644 index 0000000..4b08dc1 Binary files /dev/null and b/public/images/headface/9011.gif differ diff --git a/public/images/headface/9013.gif b/public/images/headface/9013.gif new file mode 100644 index 0000000..9bebe8d Binary files /dev/null and b/public/images/headface/9013.gif differ diff --git a/public/images/headface/9015.gif b/public/images/headface/9015.gif new file mode 100644 index 0000000..769b6be Binary files /dev/null and b/public/images/headface/9015.gif differ diff --git a/public/images/headface/9017.gif b/public/images/headface/9017.gif new file mode 100644 index 0000000..43471cc Binary files /dev/null and b/public/images/headface/9017.gif differ diff --git a/public/images/headface/9019.gif b/public/images/headface/9019.gif new file mode 100644 index 0000000..f8c1b12 Binary files /dev/null and b/public/images/headface/9019.gif differ diff --git a/public/images/headface/902.gif b/public/images/headface/902.gif new file mode 100644 index 0000000..5f5d788 Binary files /dev/null and b/public/images/headface/902.gif differ diff --git a/public/images/headface/9021.gif b/public/images/headface/9021.gif new file mode 100644 index 0000000..b984b26 Binary files /dev/null and b/public/images/headface/9021.gif differ diff --git a/public/images/headface/9023.gif b/public/images/headface/9023.gif new file mode 100644 index 0000000..4d239a6 Binary files /dev/null and b/public/images/headface/9023.gif differ diff --git a/public/images/headface/9024.gif b/public/images/headface/9024.gif new file mode 100644 index 0000000..20fb51b Binary files /dev/null and b/public/images/headface/9024.gif differ diff --git a/public/images/headface/9025.gif b/public/images/headface/9025.gif new file mode 100644 index 0000000..46b7508 Binary files /dev/null and b/public/images/headface/9025.gif differ diff --git a/public/images/headface/9026.gif b/public/images/headface/9026.gif new file mode 100644 index 0000000..0c6e466 Binary files /dev/null and b/public/images/headface/9026.gif differ diff --git a/public/images/headface/9027.gif b/public/images/headface/9027.gif new file mode 100644 index 0000000..eedfb27 Binary files /dev/null and b/public/images/headface/9027.gif differ diff --git a/public/images/headface/9028.gif b/public/images/headface/9028.gif new file mode 100644 index 0000000..1b07561 Binary files /dev/null and b/public/images/headface/9028.gif differ diff --git a/public/images/headface/9029.gif b/public/images/headface/9029.gif new file mode 100644 index 0000000..26f3b13 Binary files /dev/null and b/public/images/headface/9029.gif differ diff --git a/public/images/headface/903.gif b/public/images/headface/903.gif new file mode 100644 index 0000000..c51ba9b Binary files /dev/null and b/public/images/headface/903.gif differ diff --git a/public/images/headface/9030.gif b/public/images/headface/9030.gif new file mode 100644 index 0000000..8701004 Binary files /dev/null and b/public/images/headface/9030.gif differ diff --git a/public/images/headface/904.gif b/public/images/headface/904.gif new file mode 100644 index 0000000..5659139 Binary files /dev/null and b/public/images/headface/904.gif differ diff --git a/public/images/headface/905.gif b/public/images/headface/905.gif new file mode 100644 index 0000000..7aaee28 Binary files /dev/null and b/public/images/headface/905.gif differ diff --git a/public/images/headface/906.gif b/public/images/headface/906.gif new file mode 100644 index 0000000..a64e5c9 Binary files /dev/null and b/public/images/headface/906.gif differ diff --git a/public/images/headface/907.gif b/public/images/headface/907.gif new file mode 100644 index 0000000..5972336 Binary files /dev/null and b/public/images/headface/907.gif differ diff --git a/public/images/headface/91.gif b/public/images/headface/91.gif new file mode 100644 index 0000000..1094bd1 Binary files /dev/null and b/public/images/headface/91.gif differ diff --git a/public/images/headface/92.gif b/public/images/headface/92.gif new file mode 100644 index 0000000..a1bf86c Binary files /dev/null and b/public/images/headface/92.gif differ diff --git a/public/images/headface/93.gif b/public/images/headface/93.gif new file mode 100644 index 0000000..22a9bef Binary files /dev/null and b/public/images/headface/93.gif differ diff --git a/public/images/headface/931.gif b/public/images/headface/931.gif new file mode 100644 index 0000000..7f2faf7 Binary files /dev/null and b/public/images/headface/931.gif differ diff --git a/public/images/headface/932.gif b/public/images/headface/932.gif new file mode 100644 index 0000000..f5346cd Binary files /dev/null and b/public/images/headface/932.gif differ diff --git a/public/images/headface/933.gif b/public/images/headface/933.gif new file mode 100644 index 0000000..5aca7a2 Binary files /dev/null and b/public/images/headface/933.gif differ diff --git a/public/images/headface/934.gif b/public/images/headface/934.gif new file mode 100644 index 0000000..3a0fb38 Binary files /dev/null and b/public/images/headface/934.gif differ diff --git a/public/images/headface/935.gif b/public/images/headface/935.gif new file mode 100644 index 0000000..0a8dba9 Binary files /dev/null and b/public/images/headface/935.gif differ diff --git a/public/images/headface/936.gif b/public/images/headface/936.gif new file mode 100644 index 0000000..97a5484 Binary files /dev/null and b/public/images/headface/936.gif differ diff --git a/public/images/headface/937.gif b/public/images/headface/937.gif new file mode 100644 index 0000000..d216f8e Binary files /dev/null and b/public/images/headface/937.gif differ diff --git a/public/images/headface/938.gif b/public/images/headface/938.gif new file mode 100644 index 0000000..99ae22c Binary files /dev/null and b/public/images/headface/938.gif differ diff --git a/public/images/headface/939.gif b/public/images/headface/939.gif new file mode 100644 index 0000000..100426b Binary files /dev/null and b/public/images/headface/939.gif differ diff --git a/public/images/headface/94.gif b/public/images/headface/94.gif new file mode 100644 index 0000000..e38804c Binary files /dev/null and b/public/images/headface/94.gif differ diff --git a/public/images/headface/940.gif b/public/images/headface/940.gif new file mode 100644 index 0000000..37c40ec Binary files /dev/null and b/public/images/headface/940.gif differ diff --git a/public/images/headface/941.gif b/public/images/headface/941.gif new file mode 100644 index 0000000..b24e6f1 Binary files /dev/null and b/public/images/headface/941.gif differ diff --git a/public/images/headface/942.gif b/public/images/headface/942.gif new file mode 100644 index 0000000..5f29849 Binary files /dev/null and b/public/images/headface/942.gif differ diff --git a/public/images/headface/943.gif b/public/images/headface/943.gif new file mode 100644 index 0000000..6a4c86e Binary files /dev/null and b/public/images/headface/943.gif differ diff --git a/public/images/headface/944.gif b/public/images/headface/944.gif new file mode 100644 index 0000000..bf4c252 Binary files /dev/null and b/public/images/headface/944.gif differ diff --git a/public/images/headface/9441.gif b/public/images/headface/9441.gif new file mode 100644 index 0000000..c257a49 Binary files /dev/null and b/public/images/headface/9441.gif differ diff --git a/public/images/headface/945.gif b/public/images/headface/945.gif new file mode 100644 index 0000000..d1f78a7 Binary files /dev/null and b/public/images/headface/945.gif differ diff --git a/public/images/headface/946.gif b/public/images/headface/946.gif new file mode 100644 index 0000000..e5c2c18 Binary files /dev/null and b/public/images/headface/946.gif differ diff --git a/public/images/headface/947.gif b/public/images/headface/947.gif new file mode 100644 index 0000000..6ddac55 Binary files /dev/null and b/public/images/headface/947.gif differ diff --git a/public/images/headface/948.gif b/public/images/headface/948.gif new file mode 100644 index 0000000..6ddac55 Binary files /dev/null and b/public/images/headface/948.gif differ diff --git a/public/images/headface/949.gif b/public/images/headface/949.gif new file mode 100644 index 0000000..27d9231 Binary files /dev/null and b/public/images/headface/949.gif differ diff --git a/public/images/headface/95.gif b/public/images/headface/95.gif new file mode 100644 index 0000000..83bf304 Binary files /dev/null and b/public/images/headface/95.gif differ diff --git a/public/images/headface/950.gif b/public/images/headface/950.gif new file mode 100644 index 0000000..100426b Binary files /dev/null and b/public/images/headface/950.gif differ diff --git a/public/images/headface/951.gif b/public/images/headface/951.gif new file mode 100644 index 0000000..57d5dd6 Binary files /dev/null and b/public/images/headface/951.gif differ diff --git a/public/images/headface/952.gif b/public/images/headface/952.gif new file mode 100644 index 0000000..e697dd7 Binary files /dev/null and b/public/images/headface/952.gif differ diff --git a/public/images/headface/953.gif b/public/images/headface/953.gif new file mode 100644 index 0000000..d19e77c Binary files /dev/null and b/public/images/headface/953.gif differ diff --git a/public/images/headface/954.gif b/public/images/headface/954.gif new file mode 100644 index 0000000..63ee6d7 Binary files /dev/null and b/public/images/headface/954.gif differ diff --git a/public/images/headface/955.gif b/public/images/headface/955.gif new file mode 100644 index 0000000..4f65325 Binary files /dev/null and b/public/images/headface/955.gif differ diff --git a/public/images/headface/956.gif b/public/images/headface/956.gif new file mode 100644 index 0000000..6f8802e Binary files /dev/null and b/public/images/headface/956.gif differ diff --git a/public/images/headface/957.gif b/public/images/headface/957.gif new file mode 100644 index 0000000..1a4cac3 Binary files /dev/null and b/public/images/headface/957.gif differ diff --git a/public/images/headface/958.gif b/public/images/headface/958.gif new file mode 100644 index 0000000..34daffb Binary files /dev/null and b/public/images/headface/958.gif differ diff --git a/public/images/headface/959.gif b/public/images/headface/959.gif new file mode 100644 index 0000000..adee1e8 Binary files /dev/null and b/public/images/headface/959.gif differ diff --git a/public/images/headface/96.gif b/public/images/headface/96.gif new file mode 100644 index 0000000..3f6fbb1 Binary files /dev/null and b/public/images/headface/96.gif differ diff --git a/public/images/headface/960.gif b/public/images/headface/960.gif new file mode 100644 index 0000000..a2b1fd9 Binary files /dev/null and b/public/images/headface/960.gif differ diff --git a/public/images/headface/961.gif b/public/images/headface/961.gif new file mode 100644 index 0000000..f26bd0f Binary files /dev/null and b/public/images/headface/961.gif differ diff --git a/public/images/headface/962.gif b/public/images/headface/962.gif new file mode 100644 index 0000000..fb38e8e Binary files /dev/null and b/public/images/headface/962.gif differ diff --git a/public/images/headface/963.gif b/public/images/headface/963.gif new file mode 100644 index 0000000..93cb3a1 Binary files /dev/null and b/public/images/headface/963.gif differ diff --git a/public/images/headface/964.gif b/public/images/headface/964.gif new file mode 100644 index 0000000..333da2d Binary files /dev/null and b/public/images/headface/964.gif differ diff --git a/public/images/headface/965.gif b/public/images/headface/965.gif new file mode 100644 index 0000000..0d106aa Binary files /dev/null and b/public/images/headface/965.gif differ diff --git a/public/images/headface/966.gif b/public/images/headface/966.gif new file mode 100644 index 0000000..9991ffb Binary files /dev/null and b/public/images/headface/966.gif differ diff --git a/public/images/headface/967.gif b/public/images/headface/967.gif new file mode 100644 index 0000000..bccc1aa Binary files /dev/null and b/public/images/headface/967.gif differ diff --git a/public/images/headface/968.gif b/public/images/headface/968.gif new file mode 100644 index 0000000..21eb1ba Binary files /dev/null and b/public/images/headface/968.gif differ diff --git a/public/images/headface/969.gif b/public/images/headface/969.gif new file mode 100644 index 0000000..b6b8d90 Binary files /dev/null and b/public/images/headface/969.gif differ diff --git a/public/images/headface/97.gif b/public/images/headface/97.gif new file mode 100644 index 0000000..d240482 Binary files /dev/null and b/public/images/headface/97.gif differ diff --git a/public/images/headface/970.gif b/public/images/headface/970.gif new file mode 100644 index 0000000..7c05d06 Binary files /dev/null and b/public/images/headface/970.gif differ diff --git a/public/images/headface/971.gif b/public/images/headface/971.gif new file mode 100644 index 0000000..d73993d Binary files /dev/null and b/public/images/headface/971.gif differ diff --git a/public/images/headface/972.gif b/public/images/headface/972.gif new file mode 100644 index 0000000..0dfa884 Binary files /dev/null and b/public/images/headface/972.gif differ diff --git a/public/images/headface/973.gif b/public/images/headface/973.gif new file mode 100644 index 0000000..302e014 Binary files /dev/null and b/public/images/headface/973.gif differ diff --git a/public/images/headface/974.gif b/public/images/headface/974.gif new file mode 100644 index 0000000..974512e Binary files /dev/null and b/public/images/headface/974.gif differ diff --git a/public/images/headface/975.gif b/public/images/headface/975.gif new file mode 100644 index 0000000..d0aff0a Binary files /dev/null and b/public/images/headface/975.gif differ diff --git a/public/images/headface/976.gif b/public/images/headface/976.gif new file mode 100644 index 0000000..786c097 Binary files /dev/null and b/public/images/headface/976.gif differ diff --git a/public/images/headface/977.gif b/public/images/headface/977.gif new file mode 100644 index 0000000..c6c6d1b Binary files /dev/null and b/public/images/headface/977.gif differ diff --git a/public/images/headface/978.gif b/public/images/headface/978.gif new file mode 100644 index 0000000..4fa8dd9 Binary files /dev/null and b/public/images/headface/978.gif differ diff --git a/public/images/headface/979.gif b/public/images/headface/979.gif new file mode 100644 index 0000000..0db5a92 Binary files /dev/null and b/public/images/headface/979.gif differ diff --git a/public/images/headface/98.gif b/public/images/headface/98.gif new file mode 100644 index 0000000..049165a Binary files /dev/null and b/public/images/headface/98.gif differ diff --git a/public/images/headface/980.gif b/public/images/headface/980.gif new file mode 100644 index 0000000..00c3c22 Binary files /dev/null and b/public/images/headface/980.gif differ diff --git a/public/images/headface/981.gif b/public/images/headface/981.gif new file mode 100644 index 0000000..0ee207f Binary files /dev/null and b/public/images/headface/981.gif differ diff --git a/public/images/headface/982.gif b/public/images/headface/982.gif new file mode 100644 index 0000000..035e336 Binary files /dev/null and b/public/images/headface/982.gif differ diff --git a/public/images/headface/983.gif b/public/images/headface/983.gif new file mode 100644 index 0000000..e1e72c8 Binary files /dev/null and b/public/images/headface/983.gif differ diff --git a/public/images/headface/984.gif b/public/images/headface/984.gif new file mode 100644 index 0000000..83d70c4 Binary files /dev/null and b/public/images/headface/984.gif differ diff --git a/public/images/headface/985.gif b/public/images/headface/985.gif new file mode 100644 index 0000000..db20e4e Binary files /dev/null and b/public/images/headface/985.gif differ diff --git a/public/images/headface/99.gif b/public/images/headface/99.gif new file mode 100644 index 0000000..b31f237 Binary files /dev/null and b/public/images/headface/99.gif differ diff --git a/public/images/headface/p212.gif b/public/images/headface/p212.gif new file mode 100644 index 0000000..8f32580 Binary files /dev/null and b/public/images/headface/p212.gif differ diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 8b8ecf4..ac5ec11 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -8,12 +8,26 @@ import Pusher from "pusher-js"; window.Pusher = Pusher; +/** + * 根据当前页面环境自动检测 WebSocket 连接参数 + * + * - 当页面通过 HTTPS 访问时,自动使用 wss:// 协议和当前域名 + * - 当页面通过 HTTP 访问(本地开发)时,使用 .env 中的 Reverb 配置 + */ +const isSecure = window.location.protocol === "https:"; +const wsHost = + import.meta.env.VITE_REVERB_HOST && + import.meta.env.VITE_REVERB_HOST !== "127.0.0.1" && + import.meta.env.VITE_REVERB_HOST !== "localhost" + ? import.meta.env.VITE_REVERB_HOST + : window.location.hostname; + window.Echo = new Echo({ broadcaster: "reverb", key: import.meta.env.VITE_REVERB_APP_KEY, - wsHost: import.meta.env.VITE_REVERB_HOST, - wsPort: import.meta.env.VITE_REVERB_PORT ?? 8080, - wssPort: import.meta.env.VITE_REVERB_PORT ?? 443, - forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? "https") === "https", + wsHost: wsHost, + wsPort: isSecure ? 443 : (import.meta.env.VITE_REVERB_PORT ?? 8080), + wssPort: isSecure ? 443 : (import.meta.env.VITE_REVERB_PORT ?? 443), + forceTLS: isSecure, enabledTransports: ["ws", "wss"], }); diff --git a/resources/views/admin/autoact/index.blade.php b/resources/views/admin/autoact/index.blade.php new file mode 100644 index 0000000..1d3c776 --- /dev/null +++ b/resources/views/admin/autoact/index.blade.php @@ -0,0 +1,153 @@ +@extends('admin.layouts.app') + +@section('title', '随机事件管理') + +@section('content') +
+
+
+

随机事件管理 (autoact)

+

管理聊天室中随机触发的好运/坏运事件,可增减经验和金币。

+
+
+ + {{-- 新增事件表单 --}} +
+

➕ 添加新事件

+
+ @csrf +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+
+ + {{-- 事件列表 --}} +
+

📋 现有事件列表(共 {{ $events->count() }} 条)

+
+ + + + + + + + + + + + + + @forelse ($events as $event) + + + + + + + + + + @empty + + + + @endforelse + +
ID事件文本类型经验金币状态操作
{{ $event->id }} + {{ Str::limit($event->text_body, 60) }} + + @if ($event->event_type === 'good') + 好运 + @elseif($event->event_type === 'bad') + 坏运 + @else + 中性 + @endif + + {{ $event->exp_change > 0 ? '+' : '' }}{{ $event->exp_change }} + + {{ $event->jjb_change > 0 ? '+' : '' }}{{ $event->jjb_change }} + + + +
+ @csrf + @method('DELETE') + +
+
暂无事件,请添加。
+
+
+
+ + +@endsection diff --git a/resources/views/admin/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index ffb02e1..4796d88 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -29,9 +29,13 @@ class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.users.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}"> 👥 用户管理 - - 💾 SQL 探针 + + 🏠 房间管理 + + + 🎲 随机事件
diff --git a/resources/views/admin/rooms/index.blade.php b/resources/views/admin/rooms/index.blade.php new file mode 100644 index 0000000..efff848 --- /dev/null +++ b/resources/views/admin/rooms/index.blade.php @@ -0,0 +1,117 @@ +@extends('admin.layouts.app') + +@section('title', '房间管理') + +@section('content') +
+
+
+

房间管理

+

管理聊天室房间的名称、介绍、公告和权限设置。

+
+
+ +
+
+ @foreach ($rooms as $room) +
+ {{-- 房间信息行 --}} +
+
+ #{{ $room->id }} +
+ {{ $room->room_name }} + @if ($room->room_keep) + 系统房间 + @endif + @if (!$room->door_open) + 已关闭 + @endif +
+
+
+ 房主: {{ $room->room_owner ?: '无' }} + 人气: {{ $room->visit_num ?? 0 }} + 等级限制: ≥{{ $room->permit_level ?? 0 }} + + + +
+
+ + {{-- 编辑表单(展开) --}} +
+
+ @csrf + @method('PUT') +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + @unless ($room->room_keep) + + @csrf + @method('DELETE') + + + @endunless +
+ +
+
+ @endforeach +
+
+
+@endsection diff --git a/resources/views/admin/sql/index.blade.php b/resources/views/admin/sql/index.blade.php deleted file mode 100644 index a3ccadf..0000000 --- a/resources/views/admin/sql/index.blade.php +++ /dev/null @@ -1,98 +0,0 @@ -@extends('admin.layouts.app') - -@section('title', 'SQL 战术沙盒探针') - -@section('content') - -
-

- ⚠️ 顶级安全警告 -

-

- 此操作直接连通底层 MySQL 数据库。为杜绝《删库跑路》等生产事故,本控制台已硬编码拦截过滤:只会放行以 SELECT, SHOW, - EXPLAIN 等起手的纯只读语句。所有的增删改一律阻断。 -

-
- -
-
-
- @csrf - -
- - -
- -
- -
-
-
-
- - {{-- 结果展示区 --}} - @isset($error) -
- {{ $error }} -
- @endif - - @isset($results) -
-
- 查询结果 (共 {{ count($results) }} 条) -
- -
- @if (empty($results)) -
SQL 执行成功,但返回了空结果集 (0 rows)
- @else - - - - @foreach ($columns as $col) - - @endforeach - - - - @foreach ($results as $row) - - @foreach ($columns as $col) - - @endforeach - - @endforeach - -
- {{ $col }}
{{ $row->$col ?? 'NULL' }}
- @endif -
-
- @endisset - - - - @endsection diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index b9e76f3..a915de8 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -4,7 +4,11 @@ @section('content') -
+ @php + // 管理员级别 = 最高等级 + 1,后台编辑最高可设到管理员级别 + $adminLevel = (int) \App\Models\Sysparam::getValue('maxlevel', '15') + 1; + @endphp +
注册名 性别 等级 - 个性签名 + 经验 注册时间 管理操作 @@ -42,20 +46,32 @@ {{ $user->username }}
- {{ $user->sex }} + {{ [0 => '保密', 1 => '男', 2 => '女'][$user->sex] ?? '保密' }} + class="px-2 py-0.5 rounded-full text-xs {{ $user->user_level >= 100 ? 'bg-red-100 text-red-700 font-bold' : 'bg-gray-100 text-gray-600' }}"> LV.{{ $user->user_level }} - - {{ $user->sign ?: '-' }} + + {{ number_format($user->exp_num ?? 0) }} + {{ $user->created_at->format('Y/m/d H:i') }} @@ -86,48 +102,86 @@