Update source into github

This commit is contained in:
pbao9
2025-07-24 16:18:27 +07:00
parent 41419358dd
commit 69851ac7bc
2642 changed files with 284095 additions and 0 deletions
+197
View File
@@ -0,0 +1,197 @@
<?php
namespace App\Http\Services;
use App\Models\Setting;
use Carbon\Carbon;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class Telegram
{
protected ?string $token;
protected ?string $group;
public function __construct()
{
$record = Setting::where('key', 'setting')->first();
if ($record) {
$setting = json_decode($record->value);
$this->token = $setting->bot_token ?? null;
$this->group = $setting->bot_id ?? null;
} else {
$this->token = null;
$this->group = null;
}
}
public function SendMessage($message = '')
{
if (!$this->token || !$this->group) {
Log::channel('Custom')->warning('Telegram notification not sent: Missing bot token or group ID');
return null;
}
try {
$url = "https://api.telegram.org/bot$this->token/sendMessage?parse_mode=html&chat_id=$this->group&text=" . urlencode($message);
$response = Http::withoutVerifying()->get($url);
// Log response để debug
Log::channel('Custom')->info('Telegram sendMessage URL: ' . $url);
Log::channel('Custom')->info('Telegram sendMessage response: ' . $response->body());
Log::channel('Custom')->info('Telegram sendMessage status: ' . $response->status());
return $response;
} catch (\Exception $exception) {
Log::channel('Custom')->error('Failed to send Telegram notification: ' . $exception->getMessage());
return null;
}
}
public function SendInformation($product = [], $user = '', $password = '', $port = 22)
{
$msg = "Thông tin truy cập VPS vừa được khởi tạo 🎉 \n";
$msg .= "--------------------------------\n";
$msg .= "| 🌐 IP: " . $product['IpAddress']['ip'] . "\n";
$msg .= "| 📌 User: " . $user . "\n";
$msg .= "| 👉 Port: " . $port . "\n";
$msg .= "| 📺 Password: " . $password . "\n";
$msg .= "| 💾 Hết hạn: " . Carbon::parse($product['next_due_date'])->format('d/m/Y') . "\n";
$msg .= "| 💵 Hệ điều hành: " . $product['Os']['OsGroup']['name'] . $product['Os']['version'] . "\n";
$msg .= "| 📁 Đơn hàng số: #" . $product['order_id'] . "\n";
$msg .= "--------------------------------";
return $this->SendMessage($msg);
}
public function SendErrorMessage($data)
{
$msg = "Admin: Nhận được thông báo lỗi khi khởi tạo dịch vụ \n";
$msg .= "--------------------------------\n";
$msg .= "| " . (is_string($data) ? $data : json_encode($data)) . "\n";
$msg .= "--------------------------------";
return $this->SendMessage($msg);
}
public function SendNewUserRegistration($email, $code, $verificationLink)
{
$msg = "🎉 Thành viên mới vừa đăng ký!\n";
$msg .= "📧 Email: {$email}\n";
$msg .= "🧾 Mã xác thực: {$code}\n";
$msg .= "🔗 Link xác thực: {$verificationLink}";
return $this->SendMessage($msg);
}
public function SendCustomerRecharge($customer, $amount)
{
$msg = "💰 Khách hàng vừa nạp tiền vào tài khoản\n";
$msg .= "👤 Tên: {$customer->firstname} {$customer->lastname}\n";
$msg .= "📧 Email: {$customer->email}\n";
$msg .= "💵 Số tiền: " . number_format($amount, 0, ',', '.') . " VNĐ\n";
$msg .= "🕒 Thời gian: " . Carbon::now()->format('d/m/Y H:i:s');
return $this->SendMessage($msg);
}
public function SendJobRunInfo($jobName, $status, $additionalInfo = null)
{
$msg = "⚙️ Thông báo chạy job: {$jobName}\n";
$msg .= "⏱️ Thời gian: " . Carbon::now()->format('d/m/Y H:i:s') . "\n";
$msg .= "📊 Trạng thái: {$status}";
if ($additionalInfo) {
$msg .= "\n📋 Thông tin thêm: " . (is_string($additionalInfo) ? $additionalInfo : json_encode($additionalInfo));
}
return $this->SendMessage($msg);
}
public function SendOrderPaidNotification($invoice)
{
$invoiceItem = $invoice->invoiceItem()->with([
'vps',
'hosting',
'os.osGroup',
'addons.addonItems'
])->first();
if (!$invoiceItem) {
return $this->SendErrorMessage('Không tìm thấy invoice item từ invoice ID: ' . $invoice->id);
}
$product = $invoiceItem->product;
$os = $invoiceItem->os;
$osGroup = $os?->osGroup;
$addons = $invoiceItem->addons;
$msg = "💵 Khách đã thanh toán đơn hàng thành công!\n";
$msg .= "--------------------------------\n";
$msg .= "🧾 Đơn hàng: #{$invoice->order_num}\n";
$msg .= "📦 Sản phẩm: #{$product?->id} - {$product?->name}\n";
$msg .= "🧠 Hệ điều hành: {$osGroup?->name} {$os?->version}\n";
$msg .= "💰 Tổng tiền: " . number_format($invoice->total, 0, ',', '.') . " VNĐ\n";
$msg .= "🧍 Khách: {$invoice->customer?->firstname} {$invoice->customer?->lastname} ({$invoice->customer?->email})\n";
$msg .= "🕒 Ngày thanh toán: " . Carbon::parse($invoice->date_paid)->format('d/m/Y H:i:s') . "\n";
if ($addons && $addons->count()) {
$msg .= "➕ Addons:\n";
foreach ($addons as $addon) {
$msg .= "- {$addon->addonItems->name} (x{$addon->qty}) - " . number_format($addon->price, 0, ',', '.') . " VNĐ\n";
}
}
$msg .= "--------------------------------";
return $this->SendMessage($msg);
}
/**
* Send a photo to Telegram group
* @param string $filePath Local storage path (e.g. Upload/2024/06/01/image.png)
* @param string|null $caption Optional caption for the photo
* @return mixed|null
*/
public function SendPhoto($filePath, $caption = null)
{
if (!$this->token || !$this->group) {
Log::channel('Custom')->warning('Telegram photo not sent: Missing bot token or group ID');
return null;
}
try {
$fullPath = public_path('template/' . $filePath);
if (!file_exists($fullPath)) {
Log::channel('Custom')->error('Telegram photo not sent: File does not exist - ' . $fullPath);
return null;
}
$multipart = [
[
'name' => 'chat_id',
'contents' => $this->group,
],
[
'name' => 'photo',
'contents' => fopen($fullPath, 'r'),
],
];
if ($caption) {
$multipart[] = [
'name' => 'caption',
'contents' => $caption,
];
}
$response = Http::withoutVerifying()
->attach('photo', fopen($fullPath, 'r'), basename($fullPath))
->post("https://api.telegram.org/bot{$this->token}/sendPhoto", [
'chat_id' => $this->group,
'caption' => $caption,
]);
return $response->json();
} catch (\Exception $exception) {
Log::channel('Custom')->error('Failed to send Telegram photo: ' . $exception->getMessage());
return null;
}
}
}