123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- import { Injectable } from '@angular/core';
- import { MessageService } from './message.service';
- import * as Parse from 'parse';
- import { AiChatService } from './aichart.service';
- @Injectable({
- providedIn: 'root',
- })
- export class ConnectTaskService {
- anchorChannelName?: string;
- msChannelName: string = 'user_connect_room'; // 主播在线上报频道
- onlineUserList = new Set(); // 在线用户列表
- isSubscribe: boolean = false;
- constructor(private msgSer: MessageService, private aiSer: AiChatService) {}
- async init() {
- // 初始化消息服务,所有用户静默登录
- await this.msgSer.initRTM();
- await this.anchorOnline();
- this.getOnlieUserList(this.msChannelName, 'MESSAGE');
- this.conncetChannels();
- }
- reset() {
- this.onlineUserList = new Set();
- this.isSubscribe = false;
- }
- /* 主播上线 */
- async anchorOnline() {
- let profile;
- try {
- profile = JSON.parse(localStorage.getItem('profile') || '');
- } catch (err) {
- console.log('profile err', err);
- }
- const uid = Parse.User.current()?.id!;
- let nowChannes = await this.getWhereNow(uid);
- console.log('用户已订阅频道:', nowChannes);
- await this.msgSer.setConnectState(uid, 'ONLINE'); //主播开启并订阅自己的聊天频道
- if (profile?.identyType == 'anchor' && !this.isSubscribe) {
- // if (!nowChannes.includes(this.msChannelName)) {
- console.log('订阅成功');
- /* 主播订阅主播频道 */
- await this.msgSer.subscribeMessage(this.msChannelName);
- // }
- // if (!nowChannes.includes(uid)) {
- await this.msgSer.subscribeMessage(uid, {
- //开启并订阅自己的聊天频道
- message: true,
- presence: true,
- });
- // }
- this.isSubscribe = true;
- }else{
- await this.msgSer.subscribeMessage(uid, {
- //开启自己聊天频道用来接受招呼消息
- message: true,
- // presence: true,
- });
- }
- }
- /* 订阅好友频道 */
- async conncetChannels() {
- let uid: any = Parse.User.current()?.id;
- let resultFriends = await this.aiSer.getFriends(uid);
- resultFriends?.data?.forEach(async (item: any) => {
- let channelName = item.channel;
- await this.msgSer.subscribeMessage(
- channelName,
- {
- message: true,
- },
- item.deadline
- );
- });
- }
- /* 获取用户当前所在频道 */
- async getWhereNow(userId: string): Promise<Array<string>> {
- let channes: Array<string> = [];
- try {
- const whereNowResult = await this.msgSer.rtmClient.presence.whereNow(
- userId
- );
- const { channels, totalChannel } = whereNowResult;
- channels.forEach((channelInfo: any) => {
- const { channelName, channelType } = channelInfo;
- channes.push(channelName);
- });
- return channes;
- } catch (status: any) {
- const { operation, reason, errorCode } = status;
- console.error(
- `${operation} failed, the error code is ${errorCode}, because of: ${reason}.`
- );
- return [];
- }
- }
- /* 获取状态 */
- async getState(uid: string, channelName: string, channelType?: string) {
- try {
- const result = await this.msgSer.rtmClient.presence.getState(
- uid,
- channelName,
- channelType ?? 'MESSAGE'
- );
- const { states, userId, statesCount } = result; // Tony 的临时状态
- console.log(`${userId}用户状态:${states.Mode}`);
- // console.log(result);
- return states.Mode;
- } catch (status: any) {
- const { operation, reason, errorCode } = status;
- console.log(
- `${operation} failed, ErrorCode: ${errorCode}, because of: ${reason}.`
- );
- return 'OFFLINE';
- }
- }
- /* 获取在线用户列表 */
- async getOnlieUserList(
- channelName: string,
- page?: string,
- channelType?: string
- ) {
- if (!channelType && this.onlineUserList.size) return;
- const options: any = {
- includedUserId: true,
- includedState: true,
- };
- if (page) options.page = page;
- try {
- const result = await this.msgSer?.rtmClient?.presence?.whoNow(
- channelName,
- channelType ?? 'MESSAGE',
- options
- );
- // console.log(result);
- // 如果 nextPage 存在,下一次调用 whoNow 时,需将 nextPage 的值填入 whoNowOptions 的 page 字段
- let totalOccupancy = result?.totalOccupancy;
- let occupants = result?.occupants;
- let nextPage = result?.nextPage;
- occupants?.forEach((userInfo: any) => {
- const { states, userId, statesCount } = userInfo;
- this.onlineUserList.add(userId);
- });
- console.log('获取在线用户列表:', this.onlineUserList);
- if (nextPage) this.getOnlieUserList(channelName, nextPage, channelType);
- } catch (status: any) {
- // const { operation, reason, errorCode } = status;
- console.error('getOnlieUserList err', status);
- // console.error(
- // `${operation} failed, ErrorCode: ${errorCode}, due to: ${reason}.`
- // );
- }
- }
- }
|