feat: 构建送礼连击 manager, 从 send gift view 中抽离发送礼物-发送消息功能

This commit is contained in:
eggmanQQQ
2024-09-05 19:43:01 +08:00
parent ccbdfb7ee2
commit e45176485d
9 changed files with 435 additions and 78 deletions

View File

@@ -4,9 +4,6 @@
//
// Created by duoban on 2024/5/10.
//
#import <JXCategoryView/JXCategoryView.h>
#import <JXCategoryView/JXCategoryIndicatorBackgroundView.h>
#import <JXCategoryView/JXCategoryListContainerView.h>
#import "MsRoomMessageMainView.h"
#import "XPRoomMessageContainerView.h"
#import "ClientConfig.h"
@@ -15,13 +12,8 @@
#import "Api+Message.h"
#import "AttachmentModel.h"
#import "RoomInfoModel.h"
@interface MsRoomMessageMainView()<JXCategoryViewDelegate, JXCategoryListContainerViewDelegate,XPRoomMessageContainerViewDelegate>
///
@property (nonatomic, strong) NSArray<NSString *> *titles;
///
@property (nonatomic, strong) JXCategoryTitleView *titleView;
///lineView
@property (nonatomic, strong) JXCategoryListContainerView *pi_containerView;
@interface MsRoomMessageMainView()<XPRoomMessageContainerViewDelegate>
@property(nonatomic,strong) XPRoomMessageContainerView *roomView;
///
@@ -32,43 +24,29 @@
@implementation MsRoomMessageMainView
- (instancetype)initWithDelegate:(id<RoomHostDelegate>)delegate {
self = [super init];
if (self) {
self.hostDelegate = delegate;
// TODO:
[self installUI];
[self installConstraints];
}
return self;
}
-(void)installUI{
[self addSubview:self.titleView];
[self addSubview:self.pi_containerView];
[self addSubview:self.roomView];
}
-(void)installConstraints{
[self.titleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.leading.mas_equalTo(kGetScaleWidth(0));
make.width.mas_equalTo(150);
make.height.mas_equalTo(kGetScaleWidth(30));
}];
[self.pi_containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.bottom.mas_equalTo(self);
make.top.mas_equalTo(self.titleView.mas_bottom).offset(8);
[self.roomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
}
- (void)showUserCard:(NSInteger)uid{
[self.roomView showUserCard:uid];
}
#pragma mark - JXCategoryViewDelegate
- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView {
return self.titles.count;
}
- (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
return self.roomView;
}
#pragma mark - RoomGuestDelegate
- (void)handleNIMCustomMessage:(NIMMessage *)message {
@@ -126,51 +104,9 @@
#pragma mark -
- (NSInteger)type{
return self.titleView.selectedIndex;
}
- (JXCategoryTitleView *)titleView {
if (!_titleView) {
_titleView = [[JXCategoryTitleView alloc] init];
_titleView.delegate = self;
_titleView.titles = self.titles;
_titleView.backgroundColor = [UIColor clearColor];
_titleView.titleColor = [UIColor colorWithWhite:1 alpha:0.6];
_titleView.titleSelectedColor = UIColorFromRGB(0xFFFFFF);
_titleView.titleFont = [UIFont systemFontOfSize:13 weight:UIFontWeightMedium];
_titleView.titleSelectedFont = [UIFont systemFontOfSize:13 weight:UIFontWeightMedium];
_titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter;
_titleView.contentScrollViewClickTransitionAnimationEnabled = NO;
_titleView.defaultSelectedIndex = 0;
_titleView.cellSpacing = 20;
_titleView.cellWidthIncrement = 5;
_titleView.cellWidth = 30;
_titleView.listContainer = self.pi_containerView;
JXCategoryIndicatorImageView *lineView = [[JXCategoryIndicatorImageView alloc] init];
lineView.indicatorImageViewSize = CGSizeMake(8, 1.5);
lineView.verticalMargin = 0;
lineView.indicatorImageView.image = [UIImage imageWithColor:UIColorFromRGB(0x10ECD6) size:CGSizeMake(8, 1.5)];
lineView.indicatorImageView.layer.masksToBounds = YES;
lineView.indicatorImageView.layer.cornerRadius = 1.5/2;
_titleView.indicators = @[lineView];
}
return _titleView;
return 0;
}
- (NSArray<NSString *> *)titles{
if(!_titles){
_titles = @[YMLocalizedString(@"XPMineMainGuildListVC1")];
}
return _titles;
}
- (JXCategoryListContainerView *)pi_containerView {
if (!_pi_containerView) {
_pi_containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
_pi_containerView.defaultSelectedIndex = 0;
_pi_containerView.scrollView.tag = 1009;
}
return _pi_containerView;
}
- (XPRoomMessageContainerView *)roomView{
if(!_roomView){
_roomView = [[XPRoomMessageContainerView alloc] initWithDelegate:self.hostDelegate];

View File

@@ -0,0 +1,43 @@
//
// GiftComboManager.h
// YuMi
//
// Created by P on 2024/9/5.
//
#import <Foundation/Foundation.h>
#import "GiftInfoModel.h"
@class GiftReceiveInfoModel, UserInfoModel;
typedef enum : NSUInteger {
ComboAction_ShowPanel,
ComboAction_RemovePanel
} ComboActionType;
NS_ASSUME_NONNULL_BEGIN
@interface GiftComboManager : NSObject
// 单例方法
+ (instancetype)sharedManager;
- (void)registerActions:(void(^ _Nullable)(ComboActionType type))action;
- (void)saveSendGiftTo:(NSArray *)UIDs;
- (void)saveGiftSourceType:(GiftSourceType)type;
- (void)saveSendGiftInfo:(GiftInfoModel *)model;
- (void)saveSendGiftType:(RoomSendGiftType)type;
- (void)saveRoomUID:(NSString *)roomUID;
- (void)saveSendGiftNum:(NSString *)numString;
- (void)saveUserInfo:(UserInfoModel *)userInfo;
- (void)saveSessionID:(NSString *)sessionID;
- (void)resetCombo;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,278 @@
//
// GiftComboManager.m
// YuMi
//
// Created by P on 2024/9/5.
//
//
#import "GiftComboManager.h"
#import "UserInfoModel.h"
#import "AttachmentModel.h"
#import "GiftReceiveInfoModel.h"
#import "XPMessageRemoteExtModel.h"
#import "Api+Gift.h"
@interface GiftComboManager ()
// GiftReceiveInfoModel NSDictionary
@property (nonatomic, strong) NSMutableArray *giftComboQueue;
//
@property (nonatomic, strong) dispatch_source_t timer;
@property (nonatomic, copy) NSArray *sendGiftToUIDs;
@property (nonatomic, assign) GiftSourceType giftSourceType;
@property (nonatomic, strong) GiftInfoModel *giftInfo;
@property (nonatomic, assign) RoomSendGiftType roomSendGiftType;
@property (nonatomic, copy) NSString *roomUID;
@property (nonatomic, copy) NSString *giftNumPerTimes;
@property (nonatomic, strong) UserInfoModel *sendGiftUserInfo;
@property (nonatomic, copy) NSString *sessionID;
@property (nonatomic, assign) NSInteger combo;
@end
@implementation GiftComboManager
#pragma mark -
+ (instancetype)sharedManager {
static GiftComboManager *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
sharedInstance.giftComboQueue = [NSMutableArray array];
});
return sharedInstance;
}
// GiftReceiveInfoModel metadata
- (void)addGiftComboWithInfo:(GiftReceiveInfoModel *)info andMetadata:(NSDictionary *)metadata {
if (info && metadata) {
//
@synchronized (self) {
NSDictionary *comboData = @{@"info": info, @"metadata": metadata};
[self.giftComboQueue addObject:comboData];
}
//
[self startProcessingQueue];
}
}
- (void)addComboFromNIMAttachment:(AttachmentModel *)attachment {
if (attachment) {
//
@synchronized (self) {
[self.giftComboQueue addObject:attachment];
}
//
[self startProcessingQueue];
}
}
//
- (void)resetCombo {
_combo = 1;
}
// MARK: Logic is 0.2s
#pragma mark -
//
- (void)startProcessingQueue {
if (self.timer) {
return; //
}
// GCD
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
// 0.2
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC);
//
dispatch_source_set_event_handler(self.timer, ^{
[self processGiftComboQueue];
});
//
dispatch_resume(self.timer);
}
//
- (void)stopProcessingQueue {
if (self.timer) {
dispatch_source_cancel(self.timer);
self.timer = nil;
}
}
//
- (void)processGiftComboQueue {
@synchronized (self) {
if (self.giftComboQueue.count > 0) {
//
AttachmentModel *attachment = [self.giftComboQueue firstObject];
[self.giftComboQueue removeObjectAtIndex:0];
//
[self processGiftComboWith:attachment];
} else {
//
[self stopProcessingQueue];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"礼物处理完成");
});
}
}
}
//
- (void)processGiftComboWith:(AttachmentModel *)info {
[self sendCustomMessage:info];
}
#pragma mark - Gift meta data
- (void)saveSendGiftTo:(NSArray *)UIDs
{
_sendGiftToUIDs = UIDs;
}
- (void)saveGiftSourceType:(GiftSourceType)type
{
_giftSourceType = type;
}
- (void)saveSendGiftInfo:(GiftInfoModel *)model
{
_giftInfo = model;
}
- (void)saveSendGiftType:(RoomSendGiftType)type
{
_roomSendGiftType = type;
}
- (void)saveRoomUID:(NSString *)roomUID {
_roomUID = roomUID;
}
- (void)saveSendGiftNum:(NSString *)numString
{
_giftNumPerTimes = numString;
}
- (void)saveUserInfo:(UserInfoModel *)userInfo {
_sendGiftUserInfo = userInfo;
}
- (void)saveSessionID:(NSString *)sessionID {
_sessionID = sessionID;
}
#pragma mark - XPGiftPresenter
- (void)sendGift {
NSString *allUIDs = @"";
for (NSString *item in self.sendGiftToUIDs) {
if (allUIDs.length > 0) {
allUIDs = [allUIDs stringByAppendingString:@","];
}
allUIDs = [allUIDs stringByAppendingString:item];
}
@kWeakify(self);
[Api requestSendGift:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
@kStrongify(self);
if (code == 200) {
GiftReceiveInfoModel *receive = [GiftReceiveInfoModel modelWithJSON:data.data];
receive.sourceType = self.giftSourceType;
receive.roomSendGiftType = self.roomSendGiftType;
[self handleSendGiftSuccess:data];
} else {
// TODO:
}
}
targetUids:allUIDs
giftNum:self.giftNumPerTimes
sendType:[NSString stringWithFormat:@"%ld", GiftSendType_OnMic]
giftId:[NSString stringWithFormat:@"%ld", self.giftInfo.giftId]
giftSource:[NSString stringWithFormat:@"%ld", self.giftSourceType]
giftType:[NSString stringWithFormat:@"%ld", self.giftInfo.giftType]
roomUid:self.roomUID
msg:@""
uid:[AccountInfoStorage instance].getUid];
}
- (void)handleSendGiftSuccess:(BaseModel *)response {
GiftReceiveInfoModel *receive = [GiftReceiveInfoModel modelWithJSON:response.data];
if (!receive) {
return;
}
NSDictionary *tempDic = response.data;
NSMutableDictionary *data = [NSMutableDictionary dictionary];
[data addEntriesFromDictionary:tempDic];
AttachmentModel *attachment = [[AttachmentModel alloc] init];
switch (receive.roomSendGiftType) {
case RoomSendGiftType_AllMic: {
attachment.first = CustomMessageType_AllMicroSend;
attachment.second = Custom_Message_Sub_AllMicroSend;
[data setObject:[tempDic valueForKeyPath:@"targetUsers.uid"] forKey:@"targetUids"];
attachment.data = data;
}
break;
case RoomSendGiftType_MutableOnMic: {
attachment.first = CustomMessageType_AllMicroSend;
attachment.second = Custom_Message_Sub_AllBatchSend;
attachment.data = data;
}
break;
case RoomSendGiftType_ToOne: {
attachment.first = CustomMessageType_Gift;
attachment.second = Custom_Message_Sub_Gift_Send;
NSDictionary *targetUsers = ((NSArray *)[data objectForKey:@"targetUsers"]).firstObject;
[data setObject:[targetUsers valueForKeyPath:@"uid"] forKey:@"targetUid"];
[data setObject:[targetUsers valueForKeyPath:@"nick"] forKey:@"targetNick"];
[data setObject:[targetUsers valueForKeyPath:@"avatar"] forKey:@"targetAvatar"];
attachment.data = data;
}
break;
default:
attachment = nil;
break;
}
if (attachment) {
// TODO:
[self sendCustomMessage:attachment];
}
}
- (void)sendCustomMessage:(AttachmentModel *)attachment {
NIMMessage *message = [[NIMMessage alloc]init];
NIMCustomObject *object = [[NIMCustomObject alloc] init];
object.attachment = attachment;
message.messageObject = object;
UserInfoModel *userInfo = self.sendGiftUserInfo;
XPMessageRemoteExtModel *extModel = [[XPMessageRemoteExtModel alloc] init];
extModel.androidBubbleUrl = userInfo.androidBubbleUrl;
extModel.iosBubbleUrl = userInfo.iosBubbleUrl;
extModel.fromSayHelloChannel = userInfo.fromSayHelloChannel;
NSMutableDictionary *remoteExt = [NSMutableDictionary dictionaryWithObject:extModel.model2dictionary forKey:[NSString stringWithFormat:@"%ld", userInfo.uid]];
message.remoteExt = remoteExt;
//
NIMSession *session = [NIMSession session:self.sessionID type:NIMSessionTypeChatroom];
[[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil];
}
@end

View File

@@ -51,7 +51,7 @@ typedef NS_ENUM(NSUInteger, GiftOtherViewType) {
typedef NS_ENUM(NSUInteger, GiftSendType) {
GiftSendType_Room = 1,///zho
GiftSendType_Chat = 2,
GiftSendType_OnMic = 3,
GiftSendType_OnMic = 3,
};
/**

View File

@@ -0,0 +1,16 @@
//
// GiftComboView.h
// YuMi
//
// Created by P on 2024/9/5.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface GiftComboView : UIView
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,19 @@
//
// GiftComboView.m
// YuMi
//
// Created by P on 2024/9/5.
//
#import "GiftComboView.h"
@implementation GiftComboView
- (instancetype)init {
if (self = [super init]) {
}
return self;
}
@end

View File

@@ -47,6 +47,9 @@
#import "XPIAPRechargeViewController.h"
#import "XPWebViewController.h"
#import "PIGiftSuperGiftBroadcastView.h"
#import "GiftComboManager.h"
UIKIT_EXTERN NSString * const kFreeGiftCountdownNotification;
UIKIT_EXTERN NSString * kShowFirstRechargeView;
@@ -98,6 +101,8 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
@property (nonatomic, assign) bool didLoadPackGiftList;
@property (nonatomic, strong) NSMutableArray *sendGiftMessageArray;
@end
@implementation XPSendGiftView
@@ -109,6 +114,7 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
-(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
- (instancetype)initWithType:(SendGiftType)type uid:(NSString * __nullable)uid{
if (self = [super init]) {
self.modalPresentationStyle = UIModalPresentationOverFullScreen;
@@ -404,6 +410,26 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
}
}
/// /
- (void)readyForCombo:(XPGiftCountModel *)giftCount {
if (self.segmentType == GiftSegmentType_Pack ||
self.segmentType == GiftSegmentType_Lucky) {
return;
}
NSString *sessionID = self.usingplaceType == SendGiftType_User ? [NSString stringWithFormat:@"%ld", self.userArray.firstObject.uid] : [NSString stringWithFormat:@"%ld", [self.delegate getRoomInfo].roomId];
GiftInfoModel *giftInfo = self.giftInfoView.lastSelectGift;
[[GiftComboManager sharedManager] saveSendGiftTo:[self.userView getSelectUserList]];
[[GiftComboManager sharedManager] saveGiftSourceType:giftInfo.sourceType];
[[GiftComboManager sharedManager] saveSendGiftInfo:giftInfo];
[[GiftComboManager sharedManager] saveSendGiftType:[self dealRoomSendGiftType:giftInfo giftCount:giftCount]];
[[GiftComboManager sharedManager] saveSendGiftNum:[self dealSendGiftCount:giftCount gift:giftInfo]];
[[GiftComboManager sharedManager] saveRoomUID:self.roomUid];
[[GiftComboManager sharedManager] saveUserInfo:self.delegate.getUserInfo];
[[GiftComboManager sharedManager] saveSessionID:sessionID];
}
#pragma mark - XPGiftBarViewDelegate
- (void)xPGiftBarView:(XPGiftBarView *)view didClickSendGift:(XPGiftCountModel *)giftCount {
///
@@ -458,9 +484,9 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
///
- (void)xPGiftBarViewDidClickRecharge:(XPGiftBarView *)view {
@kWeakify(self);
// @kWeakify(self);
[self dismissViewControllerAnimated:NO completion:^{
@kStrongify(self);
// @kStrongify(self);
XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init];
rechargeVC.type = @"4";
[[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController pushViewController:rechargeVC animated:YES];
@@ -556,7 +582,7 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
self.giftBarView.drawGiftCount = 10;
[self.superGiftView removeFromSuperview];
[self.luckyBroadcastView removeFromSuperview];
[self.constellationBanner removeFromSuperview];
[self.constellationBanner removeFromSuperview];
switch (type) {
case GiftSegmentType_Lucky: {
@@ -782,12 +808,14 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
} else {
self.giftBarView.walletInfoModel = receiveInfo.userPurse;
}
@kWeakify(self);
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC));
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
@kStrongify(self);
if (self) {
[self sendCustomMessage:receiveInfo oringinDic:originDic];
[[GiftComboManager sharedManager] resetCombo];
}
});

View File

@@ -83,6 +83,8 @@
#import "XPIAPRechargeViewController.h"
#import "XPCandyTreeInsufficientBalanceView.h"
#import "GiftComboManager.h"
UIKIT_EXTERN NSString * const kRoomGiftEffectUpdateNotificationKey;
UIKIT_EXTERN NSString * const kRoomMiniNotificationKey;
UIKIT_EXTERN NSString * kNewUserRechargeKey;
@@ -281,6 +283,8 @@ NSString * const kHadQuitOtherRoomKey = @"kHadQuitOtherRoomKey";//是否退出
[[NIMSDK sharedSDK].conversationManager removeDelegate:self];
[[NIMSDK sharedSDK].broadcastManager removeDelegate:self];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self removeComboManager];
}
- (XPRoomPresenter *)createPresenter {
@@ -356,6 +360,27 @@ NSString * const kHadQuitOtherRoomKey = @"kHadQuitOtherRoomKey";//是否退出
[[NIMSDK sharedSDK].broadcastManager addDelegate:self];
}
- (void)setupComboManager {
// TODO: test view/ &
[[GiftComboManager sharedManager] registerActions:^(ComboActionType type) {
switch (type) {
case ComboAction_ShowPanel:
break;
case ComboAction_RemovePanel:
break;
default:
break;
}
}];
}
- (void)removeComboManager {
[[GiftComboManager sharedManager] registerActions:nil];
}
/// -2: roomUid
- (void)preLoadGifts {
[self.presenter getNormalGiftList:self.roomUid];