aichart.service.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. import { Injectable } from '@angular/core';
  2. import * as Parse from 'parse';
  3. import { Router } from '@angular/router';
  4. import { HttpService } from './http.service';
  5. @Injectable({
  6. providedIn: 'root',
  7. })
  8. export class AiChatService {
  9. isLoggedIn = false;
  10. company: string = 'Qje9D4bqol';
  11. emojis: Array<any> = [];
  12. get identity(): boolean {
  13. let profile = JSON.parse(localStorage.getItem('profile') || '{}');
  14. return profile?.identyType === 'anchor';
  15. }
  16. constructor(private http: HttpService) {
  17. this.initEmoji();
  18. }
  19. initEmoji() {
  20. let emojiChar =
  21. '☺-😋-😌-😍-😏-😜-😝-😞-😔-😪-😁-😂-😃-😅-😆-👿-😒-😓-😔-😏-😖-😘-😚-😒-😡-😢-😣-😤-😢-😨-😳-😵-😷-😸-😻-😼-😽-😾-😿-🙊-🙋-🙏-✈-🚇-🚃-🚌-🍄-🍅-🍆-🍇-🍈-🍉-🍑-🍒-🍓-🐔-🐶-🐷-👦-👧-👱-👩-👰-👨-👲-👳-💃-💄-💅-💆-💇-🌹-💑-💓-💘-🚲';
  22. let emojiKey = [
  23. '60a',
  24. '60b',
  25. '60c',
  26. '60d',
  27. '60f',
  28. '61b',
  29. '61d',
  30. '61e',
  31. '61f',
  32. '62a',
  33. '62c',
  34. '602',
  35. '603',
  36. '605',
  37. '606',
  38. '608',
  39. '612',
  40. '613',
  41. '614',
  42. '615',
  43. '616',
  44. '618',
  45. '619',
  46. '620',
  47. '621',
  48. '623',
  49. '624',
  50. '625',
  51. '627',
  52. '629',
  53. '633',
  54. '635',
  55. '637',
  56. '63a',
  57. '63b',
  58. '63c',
  59. '63d',
  60. '63e',
  61. '63f',
  62. '64a',
  63. '64b',
  64. '64f',
  65. '681',
  66. '68a',
  67. '68b',
  68. '68c',
  69. '344',
  70. '345',
  71. '346',
  72. '347',
  73. '348',
  74. '349',
  75. '351',
  76. '352',
  77. '353',
  78. '414',
  79. '415',
  80. '416',
  81. '466',
  82. '467',
  83. '468',
  84. '469',
  85. '470',
  86. '471',
  87. '472',
  88. '473',
  89. '483',
  90. '484',
  91. '485',
  92. '486',
  93. '487',
  94. '490',
  95. '491',
  96. '493',
  97. '498',
  98. '6b4',
  99. ];
  100. let emojis = [];
  101. let emojiCharArr = emojiChar.split('-');
  102. for (let i in emojiKey) {
  103. let em = {
  104. char: emojiCharArr[i],
  105. emoji: '0x1f' + emojiKey[i],
  106. };
  107. emojis.push(em);
  108. }
  109. this.emojis = emojis;
  110. }
  111. async getAccountLog(): Promise<any> {
  112. const uid = Parse.User.current()?.id;
  113. let query = new Parse.Query('Account');
  114. query.equalTo('user', uid);
  115. query.notEqualTo('isDeleted', true);
  116. query.select('objectId');
  117. let account = await query.first();
  118. if (!account?.id) {
  119. return;
  120. }
  121. let sql = `SELECT alog."assetCount",TO_CHAR(alog."createdAt", 'YYYY-MM-DD HH24:MI:SS') AS time,
  122. (CASE WHEN alog."targetAccount" = '${account.id}' THEN 'recharge' ELSE 'used' END) cate,
  123. "assetType","orderNumber","desc"
  124. FROM "AccountLog" AS alog
  125. WHERE (alog."targetAccount" = '${account.id}' OR alog."fromAccount" = '${account.id}')
  126. AND alog."isVerified" IS TRUE
  127. AND alog."isDeleted" IS NOT TRUE
  128. ORDER BY alog."createdAt" DESC`;
  129. let data: any = await this.http.customSQL(sql);
  130. return data?.data;
  131. }
  132. async getWallet(uid: string): Promise<any> {
  133. const data = await this.http.httpRequst(
  134. 'https://server.fmode.cn/api/ailiao/wallet',
  135. { uid: uid },
  136. 'POST'
  137. );
  138. return data['data'];
  139. }
  140. /* 获取主播余额 */
  141. async getAuthorWallet(uid: string): Promise<any> {
  142. const data = await this.http.httpRequst(
  143. 'https://server.fmode.cn/api/ailiao/wallet/anthor',
  144. { uid: uid },
  145. 'POST'
  146. );
  147. return data['data'];
  148. }
  149. getFansAndFollow(uid: string): Promise<any> {
  150. let sql = `SELECT
  151. (SELECT COUNT(*) FROM "ProfileRadar" WHERE "fromUser" = '${uid}' AND "name" = '关注' AND "isDeleted" IS NOT TRUE) AS follow,
  152. (SELECT COUNT(*) FROM "ProfileRadar" WHERE "toUser" = '${uid}' AND "name" = '关注' AND "isDeleted" IS NOT TRUE) AS fans;`;
  153. return this.http.customSQL(sql);
  154. }
  155. async getGift(type?: string): Promise<any> {
  156. let where = type ? `AND "type" = '${type}'` : '';
  157. let sql = `SELECT "objectId" AS "id","name","price","order","imgUrl","type","rightsMap"
  158. FROM "GiftModule"
  159. WHERE "company" = '${this.company}'
  160. ${where}
  161. ORDER BY "price"`;
  162. const data: any = await this.http.customSQL(sql);
  163. return data?.data;
  164. }
  165. getGiftLogCount(uid: string): Promise<any> {
  166. let sql = `SELECT SUM("index")
  167. FROM "LoveRender"
  168. WHERE "fromUser" ='${uid}'`;
  169. return this.http.customSQL(sql);
  170. }
  171. async getGiftList(uid: string, limit?: number, skip?: number): Promise<any> {
  172. let where = '';
  173. if (limit) {
  174. where = `OFFSET ${skip ?? 0} LIMIT ${limit}`;
  175. }
  176. let sql = `SELECT lr.name,lr.image
  177. FROM (
  178. SELECT *,ROW_NUMBER() OVER (PARTITION BY "gift" ORDER BY "createdAt" DESC) as rn
  179. FROM "LoveRender"
  180. WHERE "toUser" = '${uid}'
  181. AND "isDeleted" IS NOT TRUE
  182. ) lr
  183. WHERE lr.rn = 1
  184. ORDER BY lr."createdAt" DESC
  185. ${where}
  186. `;
  187. const data: any = await this.http.customSQL(sql);
  188. return data.data;
  189. }
  190. /* 获取好友列表 */
  191. async getFriends(uid: string): Promise<any> {
  192. let rejectsSql = `SELECT invited FROM "EventLog" WHERE "isDeleted" IS NOT TRUE AND "user" = '${uid}' AND "isAward" = TRUE `;
  193. let data: any = await this.http.customSQL(rejectsSql);
  194. let list = data.data;
  195. let notInclude = list?.map((item: any) => {
  196. return `'${item.invited}'`;
  197. });
  198. let sql = `SELECT u.avatar,u.nickname,u."objectId" AS uid,f."channel",
  199. f.deadline
  200. FROM
  201. (SELECT (CASE WHEN "friend" = '${uid}' THEN "user" ELSE "friend" END) fid,"channel",
  202. "Friends".config->'l0gF95BPLB' AS deadline --被删除的聊天记录时间
  203. FROM "Friends"
  204. WHERE "isDeleted" IS NOT TRUE
  205. AND "isPass" = TRUE
  206. AND ("friend" = '${uid}'
  207. OR "user" = '${uid}')
  208. GROUP BY fid,"channel",deadline) AS f
  209. LEFT JOIN "_User" AS u
  210. ON u."objectId" = f.fid
  211. ${notInclude.length > 0 ? `WHERE u."objectId" NOT IN (${notInclude})` : ''}
  212. `;
  213. return this.http.customSQL(sql);
  214. }
  215. async getRetFriends(uid: string): Promise<Parse.Object | undefined> {
  216. let query = new Parse.Query('EventLog');
  217. query.equalTo('user', Parse.User.current()?.id);
  218. query.equalTo('invited', uid);
  219. query.notEqualTo('isDeleted', false);
  220. // query.equalTo('isAward', true);
  221. query.select('isAward');
  222. return await query.first();
  223. }
  224. /* 获取系统通知 */
  225. getSysNotice(uid: string, limit?: number, skip?: number): Promise<any> {
  226. let sql = `SELECT
  227. "Friends"."objectId" fid,"friend","Friends"."user",
  228. (CASE WHEN "user" = '${uid}' THEN '请求添加' || u.name ||'为好友'
  229. ELSE '收到'||us.name||'的好友申请' END) title,
  230. (CASE WHEN "user" = '${uid}' THEN us.avatar
  231. ELSE u.avatar END) avatar,
  232. (CASE WHEN "user" = '${uid}' THEN us."objectId"
  233. ELSE u."objectId" END) tuid,
  234. (CASE WHEN "isPass" = TRUE THEN '200'
  235. WHEN "isPass" = FALSE THEN '101'
  236. ELSE '100' END) status,
  237. "Friends"."createdAt"
  238. FROM "Friends"
  239. LEFT JOIN "_User" AS u
  240. ON u."objectId" = "Friends"."user"
  241. LEFT JOIN "_User" AS us
  242. ON us."objectId" = "Friends"."friend"
  243. WHERE "Friends"."company" = '${this.company}'
  244. AND (friend = '${uid}' OR "user" = '${uid}')
  245. ORDER BY "Friends"."createdAt" DESC
  246. OFFSET ${skip || 0} LIMIT ${limit || 20}`;
  247. return this.http.customSQL(sql);
  248. }
  249. async getLinkUsers(param: any): Promise<any> {
  250. let { val, limit, skip, sex, city } = param;
  251. let whereUser = val
  252. ? `AND (u.nickname LIKE '%${val}%' OR pf.mobile LIKE '%${val}%' OR pf.name LIKE '%${val}%')`
  253. : ``;
  254. let whereSex = sex ? `AND pf.sex = '${sex}'` : ``;
  255. let whereCity = city ? `AND us."city" = '${city}'` : '';
  256. let sql = `SELECT pf.name,pf.mobile,pf.remark,pf.birthdate,
  257. u.city,u."avatar",u."objectId" uid,u."nickname"
  258. FROM "Profile" pf
  259. LEFT JOIN "_User" u
  260. ON u."objectId" = pf."user"
  261. WHERE pf."company" = 'Qje9D4bqol'
  262. ${whereUser}
  263. ${whereSex}
  264. ${whereCity}
  265. AND (pf."identyType" <> 'anchor' OR pf."identyType" IS NULL)
  266. AND pf."isCross" = TRUE
  267. AND pf."isDeleted" IS NOT TRUE
  268. ORDER BY pf."createdAt" DESC
  269. OFFSET ${skip || 0} LIMIT ${limit || 20}`;
  270. let res: any = await this.http.customSQL(sql);
  271. return res.data;
  272. }
  273. /* 赠送礼物 */
  274. async putGift(toUid: string, gid: string, giftCount?: number): Promise<any> {
  275. let baseurl = 'https://server.fmode.cn/api/ailiao/save_gift';
  276. let reqBody = {
  277. fromUid: Parse.User.current()?.id,
  278. toUid: toUid,
  279. gid: gid,
  280. index: giftCount ?? 1,
  281. };
  282. return await this.http.httpRequst(baseurl, reqBody, 'POST');
  283. }
  284. /** 获取房间列表
  285. * @star 星级
  286. * @sex 主播性别
  287. * */
  288. async getRooms(params?: any): Promise<any> {
  289. params['company'] = this.company;
  290. let baseurl = 'https://server.fmode.cn/api/ailiao/roomlist';
  291. const data = await this.http.httpRequst(baseurl, params, 'POST');
  292. return data?.data;
  293. }
  294. async getOrderAnchor(limit?: number) {
  295. let sql = `SELECT us."objectId",us."nickname",us."avatar",
  296. COALESCE(SUM(llog.gold ),0) AS "credit"
  297. FROM "LoveRender" AS llog
  298. LEFT JOIN "_User" us
  299. ON us."objectId" = llog."toUser"
  300. WHERE llog.company = '${this.company}'
  301. AND llog."isDeleted" IS NOT TRUE
  302. GROUP BY us."objectId",us."username"
  303. ORDER BY "credit" DESC LIMIT ${limit ?? 10}`;
  304. let res: any = await this.http.customSQL(sql);
  305. return res.data;
  306. }
  307. /* 获取直播时长 */
  308. async getLiveActiveLog(logid: string) {
  309. let sql = `SELECT SUM("duration") FROM "LiveActiveLog" WHERE "liveLog" = '${logid}'`;
  310. let res: any = await this.http.customSQL(sql);
  311. return res.data[0]?.sum;
  312. }
  313. async get_duration(rid: string, uid: string) {
  314. let url = 'https://server.fmode.cn/api/ailiao/remain_second';
  315. let params = {
  316. rid: rid,
  317. uid: uid,
  318. };
  319. let data = await this.http.httpRequst(url, params, 'POST');
  320. console.log(data);
  321. return data.data ?? 0;
  322. }
  323. //星座
  324. getConstellation(idCard: string): string {
  325. // 提取出生日期部分
  326. const birthDateStr = idCard.substring(6, 14);
  327. const year = parseInt(birthDateStr.substring(0, 4), 10);
  328. const month = parseInt(birthDateStr.substring(4, 6), 10);
  329. const day = parseInt(birthDateStr.substring(6, 8), 10);
  330. // 定义星座边界
  331. const constellationBoundaries = [
  332. { name: '摩羯座', start: new Date(year, 0, 20) },
  333. { name: '水瓶座', start: new Date(year, 1, 19) },
  334. { name: '双鱼座', start: new Date(year, 2, 20) },
  335. { name: '白羊座', start: new Date(year, 3, 20) },
  336. { name: '金牛座', start: new Date(year, 4, 21) },
  337. { name: '双子座', start: new Date(year, 5, 21) },
  338. { name: '巨蟹座', start: new Date(year, 6, 22) },
  339. { name: '狮子座', start: new Date(year, 7, 23) },
  340. { name: '处女座', start: new Date(year, 8, 23) },
  341. { name: '天秤座', start: new Date(year, 9, 23) },
  342. { name: '天蝎座', start: new Date(year, 10, 23) },
  343. { name: '射手座', start: new Date(year, 11, 22) },
  344. { name: '摩羯座', start: new Date(year + 1, 0, 19) }, // 用于处理12月23日及之后的情况
  345. ];
  346. // 创建输入日期对象
  347. const inputDate = new Date(year, month - 1, day);
  348. // 查找对应的星座
  349. for (let i = 0; i < constellationBoundaries.length - 1; i++) {
  350. if (
  351. inputDate >= constellationBoundaries[i].start &&
  352. inputDate < constellationBoundaries[i + 1].start
  353. ) {
  354. return constellationBoundaries[i].name;
  355. }
  356. }
  357. // 默认返回摩羯座(理论上不会执行到这里)
  358. return '摩羯座';
  359. }
  360. async getPost(limit?: number, skip?: number, uid?: string): Promise<any> {
  361. let sql = `SELECT "DramaPost"."objectId", "DramaPost".content,"DramaPost".images,"DramaPost"."isVerify",
  362. us."objectId" uid, us.avatar,us.nickname,"Profile"."identyType",TO_CHAR("DramaPost"."createdAt", 'YYYY-MM-DD HH24:MI') AS formatted_date,
  363. (SELECT "isVerify" FROM "DramaPostLog"
  364. WHERE "DramaPostLog"."dramaPost" = "DramaPost"."objectId"
  365. AND "DramaPostLog"."user" = '${Parse.User.current()?.id}'
  366. AND "DramaPostLog"."isDeleted" IS NOT TRUE
  367. LIMIT 1
  368. ) AS "isPostLog",
  369. (SELECT COUNT(*) FROM "DramaPostLog"
  370. WHERE "DramaPostLog"."dramaPost" = "DramaPost"."objectId"
  371. AND "DramaPostLog"."isDeleted" IS NOT TRUE
  372. ) AS "postCount",
  373. (SELECT "objectId" FROM "UserVip"
  374. WHERE "UserVip"."user" = "DramaPost"."user"
  375. AND "UserVip"."isDeleted" IS NOT TRUE
  376. AND DATE("UserVip"."expiredAt") >= now()
  377. ) AS "isVip"
  378. --(CASE WHEN DATE("DramaPost"."createdAt") >= now() THEN true ELSE false END)
  379. FROM "DramaPost"
  380. LEFT JOIN "_User" as us
  381. ON us."objectId" = "DramaPost"."user"
  382. LEFT JOIN "Profile"
  383. ON "Profile"."user" = "DramaPost"."user"
  384. WHERE "DramaPost"."company" = '${this.company}'
  385. AND "DramaPost"."isDeleted" IS NOT TRUE
  386. ${uid ? `AND "DramaPost"."user" = '${uid}'` : ''}
  387. ${uid ? `` : `AND "DramaPost"."isVerify" IS TRUE`}
  388. ORDER BY "DramaPost"."createdAt" DESC
  389. OFFSET ${skip ?? 0} LIMIT ${limit ?? 10}`;
  390. let res: any = await this.http.customSQL(sql);
  391. return res.data;
  392. }
  393. }