import dayjs from "dayjs"; import { Ref, ref } from "vue"; import CSMessage from "./Base/CSMessage"; import { AccountLoginRequest, CustomLoginRequest } from "./Base/Request/AccountRequest"; import { BJ_Casino_BotController } from "./BJ_Casino_BotController"; import { BJ_Casino_Bot_Lobby } from "./BJ_Casino_Bot_Lobby"; import { BJ_Casino_Bot_Login } from "./BJ_Casino_Bot_Login"; import { BJ_Casino_Bot_Slot } from "./BJ_Casino_Bot_Slot"; import { BJ_Casino_UserData } from "./BJ_Casino_Userdata"; import { INetResponse } from "./Engine/CatanEngine/NetManagerV2/Core/INetResponse"; import { NetConnector } from "./Engine/CatanEngine/NetManagerV2/NetConnector"; import { NetManager } from "./Engine/CatanEngine/NetManagerV2/NetManager"; import { Tools } from "./Tools"; export class BJ_Casino_Bot { //#region public public UserData: BJ_Casino_UserData = null; public BotController: BJ_Casino_BotController = null; public LoginScript: BJ_Casino_Bot_Login = null; public LobbyScript: BJ_Casino_Bot_Lobby = null; public SlotScript: BJ_Casino_Bot_Slot = null; // Login public IsLogin: Ref = ref(false); // Info public AID: Ref = ref(""); public NickName: Ref = ref(""); public Money: Ref = ref(0); public Level: Ref = ref(0); public Exp: Ref = ref(0); // Lobby public LobbyShow: Ref = ref(false); // Slot public SlotShow: Ref = ref(false); // Log public Log: Ref = ref(""); //#endregion //#region private private _conn: NetConnector = null; //#endregion //#region Lifecycle /** * */ constructor() { this.onLoad(); } public async onLoad(): Promise { // await this._login(); } //#endregion //#region Custom public async Login(a: string, p: string): Promise { let self: this = this; this.IsLogin.value = true; // const URL: string = "https://game.online-bj.com"; // const Port: string = "9005"; // const URL: string = "http://220.134.195.1"; // const Port: string = "19005"; const { host: URL, port: Port } = this.BotController.GetServer(); await this.ConnectAsync(URL, +Port); // 取得帳號資料 let resp: any = await this._accountLogin(a, p); await this._getAccountInfo(resp.a, resp.pw); this.LobbyShow.value = true; this.SetUI(); } public async Logout(): Promise { NetManager.Disconnect(); this.IsLogin.value = false; this.LobbyShow.value = false; this.LobbyScript.IsSlotIn.value = false; this.SlotShow.value = false; this.SlotScript.IsSpin.value = false; this.SlotScript.IsRun = false; } private async _accountLogin(account: string, password: string): Promise { let req: CustomLoginRequest = new CustomLoginRequest(account, password); await req.SendAsync(true); let resp: INetResponse = req.Result; if (!resp.IsValid) { this.IsLogin.value = false; CSMessage.NetError(resp.Method, resp.Status, "Registe Account Error!"); return; } return resp.Data; } private async _getAccountInfo(a: string, pw: string): Promise { // 取得帳號資料 let req: AccountLoginRequest = new AccountLoginRequest(a, pw); await req.SendAsync(true); let resp: INetResponse = req.Result; if (!resp.IsValid) { this.IsLogin.value = false CSMessage.NetError(resp.Method, resp.Status, "Login Account Error!"); return; } this.UserData = new BJ_Casino_UserData(resp.Data["id"].toString(), resp.Data["name"].toString(), +resp.Data["m"], +resp.Data["lv"], +resp.Data["exp"]); } public SetUI(): void { this.AID.value = this.UserData.AID; this.NickName.value = this.UserData.NickName; this.Money.value = this.UserData.Money; this.Level.value = this.UserData.Level; this.Exp.value = this.UserData.Exp; } public AddLog(log: string, ...args: any[]): void { let AIDLog: string = ``; if (this.UserData?.AID) { AIDLog = `AID: ${this.UserData.AID} `; } console.log(`${AIDLog}${log}`, ...args); let time: string = dayjs().format("YYYY/MM/DD HH:mm:ss.SSS"); if (args.length > 0) { this.Log.value += `${time} ${log}, ${args}\n`; } else { this.Log.value += `${time} ${log}\n`; } const textarea: HTMLElement | null = document.getElementById("DIV_LOG"); if (textarea) { textarea.scrollTop = textarea.scrollHeight; } } //#endregion //#region Onclick //#endregion //#region 網路相關 /** 連線(目前沒有重連機制) */ public async ConnectAsync(host: string, port: number): Promise { var url: string = "https://api.ipify.org/?format=json"; var xhr: XMLHttpRequest = new XMLHttpRequest(); let ip: string = ""; xhr.onreadystatechange = function (): void { if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 400)) { ip = JSON.parse(xhr.responseText)["ip"]; } }; xhr.open("GET", url, true); xhr.send(); this.AddLog("[事件]準備連線..."); while (ip === "") { await Tools.Sleep(1); } this._conn = new NetConnector(host, port, ip); this._conn.OnDataReceived.AddCallback(this._onNetDataReceived, this); this._conn.OnDisconnected.AddCallback(this._onNetDisconnected, this); NetManager.Initialize(this._conn); this.AddLog("[事件]連線中..."); // 同個connector要再次連線, 可以不用叫CasinoNetManager.Initialize(), 但要先叫CasinoNetManager.Disconnect() await NetManager.ConnectAsync(); this.AddLog(String.Format("[事件]連線狀態: {0}", NetManager.IsConnected)); } private _onNetDisconnected(): void { this.AddLog("[事件] 收到連線中斷事件"); this._conn.OnDataReceived.RemoveAllCallbacks(); // MainControl.DataReceivedEvent.DispatchCallback([MainControl.DataType.NetDisconnected]); } private _onNetDataReceived(resp: INetResponse): void { let AIDLog: string = ``; if (this.UserData?.AID) { AIDLog = `AID: ${this.UserData.AID} `; } console.log(`${AIDLog}[事件] 收到server呼叫: ${resp.Method}(${JSON.stringify(resp.Data)}), 狀態: ${resp.Status}`); // MainControl.DataReceivedEvent.DispatchCallback([MainControl.DataType.ServerData, resp]); } //#endregion }