import { Injectable } from '@angular/core'; import * as Parse from 'parse'; import { Router } from '@angular/router'; import { HttpService } from './http.service'; @Injectable({ providedIn: 'root', }) export class AiChatService { isLoggedIn = false; company: string = 'Qje9D4bqol'; emojis: Array = []; get identity(): boolean { let profile = JSON.parse(localStorage.getItem('profile') || '{}'); return profile?.identyType === 'anchor'; } constructor(private http: HttpService) { this.initEmoji(); } initEmoji() { let emojiChar = 'โ˜บ-๐Ÿ˜‹-๐Ÿ˜Œ-๐Ÿ˜-๐Ÿ˜-๐Ÿ˜œ-๐Ÿ˜-๐Ÿ˜ž-๐Ÿ˜”-๐Ÿ˜ช-๐Ÿ˜-๐Ÿ˜‚-๐Ÿ˜ƒ-๐Ÿ˜…-๐Ÿ˜†-๐Ÿ‘ฟ-๐Ÿ˜’-๐Ÿ˜“-๐Ÿ˜”-๐Ÿ˜-๐Ÿ˜–-๐Ÿ˜˜-๐Ÿ˜š-๐Ÿ˜’-๐Ÿ˜ก-๐Ÿ˜ข-๐Ÿ˜ฃ-๐Ÿ˜ค-๐Ÿ˜ข-๐Ÿ˜จ-๐Ÿ˜ณ-๐Ÿ˜ต-๐Ÿ˜ท-๐Ÿ˜ธ-๐Ÿ˜ป-๐Ÿ˜ผ-๐Ÿ˜ฝ-๐Ÿ˜พ-๐Ÿ˜ฟ-๐Ÿ™Š-๐Ÿ™‹-๐Ÿ™-โœˆ-๐Ÿš‡-๐Ÿšƒ-๐ŸšŒ-๐Ÿ„-๐Ÿ…-๐Ÿ†-๐Ÿ‡-๐Ÿˆ-๐Ÿ‰-๐Ÿ‘-๐Ÿ’-๐Ÿ“-๐Ÿ”-๐Ÿถ-๐Ÿท-๐Ÿ‘ฆ-๐Ÿ‘ง-๐Ÿ‘ฑ-๐Ÿ‘ฉ-๐Ÿ‘ฐ-๐Ÿ‘จ-๐Ÿ‘ฒ-๐Ÿ‘ณ-๐Ÿ’ƒ-๐Ÿ’„-๐Ÿ’…-๐Ÿ’†-๐Ÿ’‡-๐ŸŒน-๐Ÿ’‘-๐Ÿ’“-๐Ÿ’˜-๐Ÿšฒ'; let emojiKey = [ '60a', '60b', '60c', '60d', '60f', '61b', '61d', '61e', '61f', '62a', '62c', '602', '603', '605', '606', '608', '612', '613', '614', '615', '616', '618', '619', '620', '621', '623', '624', '625', '627', '629', '633', '635', '637', '63a', '63b', '63c', '63d', '63e', '63f', '64a', '64b', '64f', '681', '68a', '68b', '68c', '344', '345', '346', '347', '348', '349', '351', '352', '353', '414', '415', '416', '466', '467', '468', '469', '470', '471', '472', '473', '483', '484', '485', '486', '487', '490', '491', '493', '498', '6b4', ]; let emojis = []; let emojiCharArr = emojiChar.split('-'); for (let i in emojiKey) { let em = { char: emojiCharArr[i], emoji: '0x1f' + emojiKey[i], }; emojis.push(em); } this.emojis = emojis; } async getAccountLog(): Promise { const uid = Parse.User.current()?.id; let query = new Parse.Query('Account'); query.equalTo('user', uid); query.notEqualTo('isDeleted', true); query.select('objectId'); let account = await query.first(); if (!account?.id) { return; } let sql = `SELECT alog."assetCount",TO_CHAR(alog."createdAt", 'YYYY-MM-DD HH24:MI:SS') AS time, (CASE WHEN alog."targetAccount" = '${account.id}' THEN 'recharge' ELSE 'used' END) cate, "assetType","orderNumber","desc" FROM "AccountLog" AS alog WHERE (alog."targetAccount" = '${account.id}' OR alog."fromAccount" = '${account.id}') AND alog."isVerified" IS TRUE AND alog."isDeleted" IS NOT TRUE ORDER BY alog."createdAt" DESC`; let data: any = await this.http.customSQL(sql); return data?.data; } async getWallet(uid: string): Promise { const data = await this.http.httpRequst( 'https://server.fmode.cn/api/ailiao/wallet', { uid: uid }, 'POST' ); return data['data']; } /* ่Žทๅ–ไธปๆ’ญไฝ™้ข */ async getAuthorWallet(uid: string): Promise { const data = await this.http.httpRequst( 'https://server.fmode.cn/api/ailiao/wallet/anthor', { uid: uid }, 'POST' ); return data['data']; } getFansAndFollow(uid: string): Promise { let sql = `SELECT (SELECT COUNT(*) FROM "ProfileRadar" WHERE "fromUser" = '${uid}' AND "name" = 'ๅ…ณๆณจ' AND "isDeleted" IS NOT TRUE) AS follow, (SELECT COUNT(*) FROM "ProfileRadar" WHERE "toUser" = '${uid}' AND "name" = 'ๅ…ณๆณจ' AND "isDeleted" IS NOT TRUE) AS fans;`; return this.http.customSQL(sql); } async getGift(type?: string): Promise { let where = type ? `AND "type" = '${type}'` : ''; let sql = `SELECT "objectId" AS "id","name","price","order","imgUrl","type","rightsMap" FROM "GiftModule" WHERE "company" = '${this.company}' ${where} ORDER BY "price"`; const data: any = await this.http.customSQL(sql); return data?.data; } getGiftLogCount(uid: string): Promise { let sql = `SELECT SUM("index") FROM "LoveRender" WHERE "fromUser" ='${uid}'`; return this.http.customSQL(sql); } async getGiftList(uid: string, limit?: number, skip?: number): Promise { let where = ''; if (limit) { where = `OFFSET ${skip ?? 0} LIMIT ${limit}`; } let sql = `SELECT lr.name,lr.image FROM ( SELECT *,ROW_NUMBER() OVER (PARTITION BY "gift" ORDER BY "createdAt" DESC) as rn FROM "LoveRender" WHERE "toUser" = '${uid}' AND "isDeleted" IS NOT TRUE ) lr WHERE lr.rn = 1 ORDER BY lr."createdAt" DESC ${where} `; const data: any = await this.http.customSQL(sql); return data.data; } /* ่Žทๅ–ๅฅฝๅ‹ๅˆ—่กจ */ async getFriends(uid: string): Promise { let rejectsSql = `SELECT invited FROM "EventLog" WHERE "isDeleted" IS NOT TRUE AND "user" = '${uid}' AND "isAward" = TRUE `; let data: any = await this.http.customSQL(rejectsSql); let list = data.data; let notInclude = list?.map((item: any) => { return `'${item.invited}'`; }); let sql = `SELECT u.avatar,u.nickname,u."objectId" AS uid,f."channel", f.deadline FROM (SELECT (CASE WHEN "friend" = '${uid}' THEN "user" ELSE "friend" END) fid,"channel", "Friends".config->'l0gF95BPLB' AS deadline --่ขซๅˆ ้™ค็š„่Šๅคฉ่ฎฐๅฝ•ๆ—ถ้—ด FROM "Friends" WHERE "isDeleted" IS NOT TRUE AND "isPass" = TRUE AND ("friend" = '${uid}' OR "user" = '${uid}') GROUP BY fid,"channel",deadline) AS f LEFT JOIN "_User" AS u ON u."objectId" = f.fid ${notInclude.length > 0 ? `WHERE u."objectId" NOT IN (${notInclude})` : ''} `; return this.http.customSQL(sql); } async getRetFriends(uid: string): Promise { let query = new Parse.Query('EventLog'); query.equalTo('user', Parse.User.current()?.id); query.equalTo('invited', uid); query.notEqualTo('isDeleted', false); // query.equalTo('isAward', true); query.select('isAward'); return await query.first(); } /* ่Žทๅ–็ณป็ปŸ้€š็Ÿฅ */ getSysNotice(uid: string, limit?: number, skip?: number): Promise { let sql = `SELECT "Friends"."objectId" fid,"friend","Friends"."user", (CASE WHEN "user" = '${uid}' THEN '่ฏทๆฑ‚ๆทปๅŠ ' || u.name ||'ไธบๅฅฝๅ‹' ELSE 'ๆ”ถๅˆฐ'||us.name||'็š„ๅฅฝๅ‹็”ณ่ฏท' END) title, (CASE WHEN "user" = '${uid}' THEN us.avatar ELSE u.avatar END) avatar, (CASE WHEN "user" = '${uid}' THEN us."objectId" ELSE u."objectId" END) tuid, (CASE WHEN "isPass" = TRUE THEN '200' WHEN "isPass" = FALSE THEN '101' ELSE '100' END) status, "Friends"."createdAt" FROM "Friends" LEFT JOIN "_User" AS u ON u."objectId" = "Friends"."user" LEFT JOIN "_User" AS us ON us."objectId" = "Friends"."friend" WHERE "Friends"."company" = '${this.company}' AND (friend = '${uid}' OR "user" = '${uid}') ORDER BY "Friends"."createdAt" DESC OFFSET ${skip || 0} LIMIT ${limit || 20}`; return this.http.customSQL(sql); } async getLinkUsers(param: any): Promise { let { val, limit, skip, sex, city } = param; let whereUser = val ? `AND (u.nickname LIKE '%${val}%' OR pf.mobile LIKE '%${val}%' OR pf.name LIKE '%${val}%')` : ``; let whereSex = sex ? `AND pf.sex = '${sex}'` : ``; let whereCity = city ? `AND us."city" = '${city}'` : ''; let sql = `SELECT pf.name,pf.mobile,pf.remark,pf.birthdate, u.city,u."avatar",u."objectId" uid,u."nickname" FROM "Profile" pf LEFT JOIN "_User" u ON u."objectId" = pf."user" WHERE pf."company" = 'Qje9D4bqol' ${whereUser} ${whereSex} ${whereCity} AND (pf."identyType" <> 'anchor' OR pf."identyType" IS NULL) AND pf."isCross" = TRUE AND pf."isDeleted" IS NOT TRUE ORDER BY pf."createdAt" DESC OFFSET ${skip || 0} LIMIT ${limit || 20}`; let res: any = await this.http.customSQL(sql); return res.data; } /* ่ต ้€็คผ็‰ฉ */ async putGift(toUid: string, gid: string, giftCount?: number): Promise { let baseurl = 'https://server.fmode.cn/api/ailiao/save_gift'; let reqBody = { fromUid: Parse.User.current()?.id, toUid: toUid, gid: gid, index: giftCount ?? 1, }; return await this.http.httpRequst(baseurl, reqBody, 'POST'); } /** ่Žทๅ–ๆˆฟ้—ดๅˆ—่กจ * @star ๆ˜Ÿ็บง * @sex ไธปๆ’ญๆ€งๅˆซ * */ async getRooms(params?: any): Promise { params['company'] = this.company; let baseurl = 'https://server.fmode.cn/api/ailiao/roomlist'; const data = await this.http.httpRequst(baseurl, params, 'POST'); return data?.data; } async getOrderAnchor(limit?: number) { let sql = `SELECT us."objectId",us."nickname",us."avatar", COALESCE(SUM(llog.gold ),0) AS "credit" FROM "LoveRender" AS llog LEFT JOIN "_User" us ON us."objectId" = llog."toUser" WHERE llog.company = '${this.company}' AND llog."isDeleted" IS NOT TRUE GROUP BY us."objectId",us."username" ORDER BY "credit" DESC LIMIT ${limit ?? 10}`; let res: any = await this.http.customSQL(sql); return res.data; } /* ่Žทๅ–็›ดๆ’ญๆ—ถ้•ฟ */ async getLiveActiveLog(logid: string) { let sql = `SELECT SUM("duration") FROM "LiveActiveLog" WHERE "liveLog" = '${logid}'`; let res: any = await this.http.customSQL(sql); return res.data[0]?.sum; } async get_duration(rid: string, uid: string) { let url = 'https://server.fmode.cn/api/ailiao/remain_second'; let params = { rid: rid, uid: uid, }; let data = await this.http.httpRequst(url, params, 'POST'); console.log(data); return data.data ?? 0; } //ๆ˜Ÿๅบง getConstellation(idCard: string): string { // ๆๅ–ๅ‡บ็”Ÿๆ—ฅๆœŸ้ƒจๅˆ† const birthDateStr = idCard.substring(6, 14); const year = parseInt(birthDateStr.substring(0, 4), 10); const month = parseInt(birthDateStr.substring(4, 6), 10); const day = parseInt(birthDateStr.substring(6, 8), 10); // ๅฎšไน‰ๆ˜Ÿๅบง่พน็•Œ const constellationBoundaries = [ { name: 'ๆ‘ฉ็พฏๅบง', start: new Date(year, 0, 20) }, { name: 'ๆฐด็“ถๅบง', start: new Date(year, 1, 19) }, { name: 'ๅŒ้ฑผๅบง', start: new Date(year, 2, 20) }, { name: '็™ฝ็พŠๅบง', start: new Date(year, 3, 20) }, { name: '้‡‘็‰›ๅบง', start: new Date(year, 4, 21) }, { name: 'ๅŒๅญๅบง', start: new Date(year, 5, 21) }, { name: 'ๅทจ่Ÿนๅบง', start: new Date(year, 6, 22) }, { name: '็‹ฎๅญๅบง', start: new Date(year, 7, 23) }, { name: 'ๅค„ๅฅณๅบง', start: new Date(year, 8, 23) }, { name: 'ๅคฉ็งคๅบง', start: new Date(year, 9, 23) }, { name: 'ๅคฉ่Žๅบง', start: new Date(year, 10, 23) }, { name: 'ๅฐ„ๆ‰‹ๅบง', start: new Date(year, 11, 22) }, { name: 'ๆ‘ฉ็พฏๅบง', start: new Date(year + 1, 0, 19) }, // ็”จไบŽๅค„็†12ๆœˆ23ๆ—ฅๅŠไน‹ๅŽ็š„ๆƒ…ๅ†ต ]; // ๅˆ›ๅปบ่พ“ๅ…ฅๆ—ฅๆœŸๅฏน่ฑก const inputDate = new Date(year, month - 1, day); // ๆŸฅๆ‰พๅฏนๅบ”็š„ๆ˜Ÿๅบง for (let i = 0; i < constellationBoundaries.length - 1; i++) { if ( inputDate >= constellationBoundaries[i].start && inputDate < constellationBoundaries[i + 1].start ) { return constellationBoundaries[i].name; } } // ้ป˜่ฎค่ฟ”ๅ›žๆ‘ฉ็พฏๅบง๏ผˆ็†่ฎบไธŠไธไผšๆ‰ง่กŒๅˆฐ่ฟ™้‡Œ๏ผ‰ return 'ๆ‘ฉ็พฏๅบง'; } async getPost(limit?: number, skip?: number, uid?: string): Promise { let sql = `SELECT "DramaPost"."objectId", "DramaPost".content,"DramaPost".images,"DramaPost"."isVerify", us."objectId" uid, us.avatar,us.nickname,"Profile"."identyType",TO_CHAR("DramaPost"."createdAt", 'YYYY-MM-DD HH24:MI') AS formatted_date, (SELECT "isVerify" FROM "DramaPostLog" WHERE "DramaPostLog"."dramaPost" = "DramaPost"."objectId" AND "DramaPostLog"."user" = '${Parse.User.current()?.id}' AND "DramaPostLog"."isDeleted" IS NOT TRUE LIMIT 1 ) AS "isPostLog", (SELECT COUNT(*) FROM "DramaPostLog" WHERE "DramaPostLog"."dramaPost" = "DramaPost"."objectId" AND "DramaPostLog"."isDeleted" IS NOT TRUE ) AS "postCount", (SELECT "objectId" FROM "UserVip" WHERE "UserVip"."user" = "DramaPost"."user" AND "UserVip"."isDeleted" IS NOT TRUE AND DATE("UserVip"."expiredAt") >= now() ) AS "isVip" --(CASE WHEN DATE("DramaPost"."createdAt") >= now() THEN true ELSE false END) FROM "DramaPost" LEFT JOIN "_User" as us ON us."objectId" = "DramaPost"."user" LEFT JOIN "Profile" ON "Profile"."user" = "DramaPost"."user" WHERE "DramaPost"."company" = '${this.company}' AND "DramaPost"."isDeleted" IS NOT TRUE ${uid ? `AND "DramaPost"."user" = '${uid}'` : ''} ${uid ? `` : `AND "DramaPost"."isVerify" IS TRUE`} ORDER BY "DramaPost"."createdAt" DESC OFFSET ${skip ?? 0} LIMIT ${limit ?? 10}`; let res: any = await this.http.customSQL(sql); return res.data; } }