fuc-new/src/Models/LoginIp.php
2025-12-30 18:57:14 +08:00

79 lines
2.1 KiB
PHP
Executable File

<?php
declare(strict_types=1);
namespace App\Models;
use App\Services\Notification;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Database\Query\Builder;
use Psr\Http\Client\ClientExceptionInterface;
use Telegram\Bot\Exceptions\TelegramSDKException;
use function date;
use function time;
/**
* @property int $id 记录ID
* @property int $userid 用户ID
* @property string $ip 登录IP
* @property int $datetime 登录时间
* @property int $type 登录类型
*
* @mixin Builder
*/
final class LoginIp extends Model
{
protected $connection = 'default';
protected $table = 'login_ip';
/**
* 登录用户
*/
public function user(): ?User
{
return (new User())->find($this->userid);
}
/**
* 登录成功与否
*/
public function type(): string
{
return $this->type === 0 ? '成功' : '失败';
}
/**
* 记录登录 IP
*
* @param string $ip IP
* @param int $type 1 = failed, 0 = success
* @param int $user_id User ID
*/
public function collectLoginIP(string $ip, int $type = 0, int $user_id = 0): void
{
if (Config::obtain('login_log')) {
$this->ip = $ip;
$this->userid = $user_id;
$this->datetime = time();
$this->type = $type;
if (Config::obtain('notify_new_login') &&
$user_id !== 0 &&
(new LoginIp())->where('userid', $user_id)->where('ip', $this->ip)->count() === 0
) {
try {
Notification::notifyUser(
(new User())->where('id', $user_id)->first(),
$_ENV['appName'] . ' - 新登录通知',
'你的账号于 ' . date('Y-m-d H:i:s') . ' 通过 ' . $this->ip . ' 地址登录了用户面板',
);
} catch (GuzzleException|ClientExceptionInterface|TelegramSDKException $e) {
echo $e->getMessage();
}
}
$this->save();
}
}
}