Bläddra i källkod

модель CharMail и поддержка в контроллере

ilg2005 3 månader sedan
förälder
incheckning
6e774db44c
2 ändrade filer med 173 tillägg och 0 borttagningar
  1. 2 0
      app/Http/Controllers/CharController.php
  2. 171 0
      app/Models/Char/CharMail.php

+ 2 - 0
app/Http/Controllers/CharController.php

@@ -8,6 +8,7 @@ use App\Models\Char\CharCashItem_OutputBox;
 use App\Models\Char\CharItem;
 use App\Models\Char\CharFellow;
 use App\Models\Char\CharQuest;
+use App\Models\Char\CharMail;
 use Illuminate\Support\Facades\Log;
 use App\Models\Char\CharQuest_History;
 
@@ -456,6 +457,7 @@ class CharController extends Controller
         'CharCashItem_OutputBox' => ['key' => 'Owner', 'model' => CharCashItem_OutputBox::class, 'pk' => 'ItemDBIndex'],
         'CharQuest' => ['key' => 'Owner', 'model' => CharQuest::class, 'pk' => 'RecId'],
         'CharQuest_History' => ['key' => 'Owner', 'model' => CharQuest_History::class, 'pk' => 'RecId'],
+        'CharMail' => ['key' => 'RecverDBKey', 'model' => CharMail::class, 'pk' => 'MailDBKey'],
     ];
 
 

+ 171 - 0
app/Models/Char/CharMail.php

@@ -0,0 +1,171 @@
+<?php
+
+namespace App\Models\Char;
+
+use Illuminate\Database\Eloquent\Model;
+
+class CharMail extends Model
+{
+    protected $connection = 'Char';
+    protected $table = 'Table_CharMail';
+    protected $primaryKey = 'MailDBKey';
+    protected $dates = ['CreateDate', 'ReadDate'];
+    protected $fillable = [
+        'RecverDBKey',
+        'Slot',
+        'Deleted',
+        'MailDBKey',
+        'SentMailDBKey',
+        'SenderDBKeyAccount',
+        'SenderDBKey',
+        'SendName',
+        'RecvName',
+        'bRead',
+        'Title',
+        'MailType',
+        'CreateDate',
+        'ReadDate',
+        'Money',
+        'AlreadyMoney',
+        'Letter',
+        'ItemCount',
+        'ItemSlot0',
+        'ItemSlot1',
+        'ItemSlot2',
+        'ItemSlot3',
+        'ItemSlot4',
+        'AlreadyItem0',
+        'AlreadyItem1',
+        'AlreadyItem2',
+        'AlreadyItem3',
+        'AlreadyItem4',
+        'AlreadyItem5',
+        'AlreadyItem6',
+        'AlreadyItem7',
+        'AlreadyItem8',
+        'AlreadyItem9',
+        'Confirm',
+        'binLetter',
+        'MailSerial',
+        'binTitle',
+    ];
+
+    public $timestamps = false;
+
+    public function getBinLetterAttribute($value)
+    {
+        return $this->decodeBinaryValue($value);
+    }
+
+    public function setBinLetterAttribute($value)
+    {
+        $this->attributes['binLetter'] = $this->encodeBinaryValue($value);
+    }
+
+    public function getBinTitleAttribute($value)
+    {
+        return $this->decodeBinaryValue($value);
+    }
+
+    public function setBinTitleAttribute($value)
+    {
+        $this->attributes['binTitle'] = $this->encodeBinaryValue($value);
+    }
+
+    private function decodeBinaryValue(?string $value): ?string
+    {
+        $value = $this->stripNulls($value);
+        if ($value === null || $value === '') {
+            return $value;
+        }
+
+        $decoded = $this->decodeBase64($this->decodeBase64($value));
+        $decoded = $this->stripNulls($decoded);
+
+        return $decoded === null ? null : $this->ensureUtf8($decoded);
+    }
+
+    private function encodeBinaryValue(?string $value): ?string
+    {
+        $value = $this->stripNulls($value);
+        if ($value === null || $value === '') {
+            return $value;
+        }
+
+        $prepared = @iconv('UTF-8', 'CP1251//IGNORE', $value);
+        if ($prepared === false) {
+            $prepared = $value;
+        }
+
+        return base64_encode(base64_encode($prepared));
+    }
+
+    private function stripNulls(?string $value): ?string
+    {
+        return $value === null ? null : rtrim($value, "\0");
+    }
+
+    private function decodeBase64(string $value): string
+    {
+        $decoded = base64_decode($value, true);
+        return $decoded === false ? $value : $decoded;
+    }
+
+    private function ensureUtf8(string $value): string
+    {
+        if ($value === '') {
+            return '';
+        }
+
+        if (mb_check_encoding($value, 'UTF-8')) {
+            return $this->removeControlChars($value);
+        }
+
+        $candidates = [];
+
+        if (function_exists('iconv')) {
+            $candidates[] = fn () => @iconv('CP1251', 'UTF-8//IGNORE', $value);
+        }
+
+        if (function_exists('mb_convert_encoding')) {
+            $candidates[] = fn () => @mb_convert_encoding($value, 'UTF-8', 'CP1251');
+            $candidates[] = fn () => @mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1');
+        }
+
+        $candidates[] = fn () => utf8_encode($value);
+
+        foreach ($candidates as $candidate) {
+            $converted = $candidate();
+            if (is_string($converted) && mb_check_encoding($converted, 'UTF-8')) {
+                return $this->removeControlChars($converted);
+            }
+        }
+
+        if (function_exists('iconv')) {
+            $sanitized = @iconv('UTF-8', 'UTF-8//IGNORE', $value);
+            if (is_string($sanitized) && mb_check_encoding($sanitized, 'UTF-8')) {
+                return $this->removeControlChars($sanitized);
+            }
+        }
+
+        return '';
+    }
+
+    private function removeControlChars(string $value): string
+    {
+        $clean = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $value);
+        return is_string($clean) ? $clean : '';
+    }
+
+    public function toArray()
+    {
+        $array = parent::toArray();
+        array_walk_recursive($array, function (&$v) {
+            if (is_string($v)) {
+                $v = $this->ensureUtf8($v);
+            }
+        });
+        return $array;
+    }
+
+}