This commit is contained in:
启星
2025-10-15 17:21:09 +08:00
parent 3ba569dfa3
commit 2b477e8912
51 changed files with 1306 additions and 249 deletions

View File

@@ -9,9 +9,27 @@
#import "MQTTClient.h"
#import "MQTTSessionManager.h"
#import <CommonCrypto/CommonHMAC.h>
//typedef NS_ENUM(NSInteger) {
// /// 巡乐会进度更新
// QXManagerMqttTypeAcProgress = 100,
// /// 巡乐会即将开始
// QXManagerMqttTypeAcWill = 101,
// /// 巡乐会已经开始
// QXManagerMqttTypeAcStart = 102,
// /// 巡乐会结束落包
// QXManagerMqttTypeAcEnd = 103,
// /// 有人锁定了礼物
// QXManagerMqttTypeAcLock = 103,
//}QXManagerMqttType;
/// 礼物话题
static NSString * _Nonnull qx_room_topic = @"qx_room_topic";
/// 巡乐会话题
static NSString * _Nonnull qx_ac_topic = @"qx_xunlehui";
/// 小时榜话题
static NSString * _Nonnull qx_hour_ranking = @"qx_hour_ranking";
/// 红包话题
static NSString * _Nonnull qx_red_redpacket = @"qx_redpacket_arrive";
NS_ASSUME_NONNULL_BEGIN
@protocol MQTTClientModelDelegate <NSObject>

View File

@@ -81,6 +81,7 @@
[self subscribeTopic:qx_room_topic];
[self subscribeTopic:qx_ac_topic];
[self subscribeTopic:qx_hour_ranking];
[self subscribeTopic:qx_red_redpacket];
[self reConnectForStateError];
break;

View File

@@ -10,9 +10,16 @@
@class QXRedPacketManager;
@protocol QXRedPacketManagerDelegate <NSObject>
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didAddRedPacket:(QXRedPacketModel *)redPacket;
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didRemoveRedPacket:(NSString *)packetId;
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didUpdateRedPacket:(QXRedPacketModel *)redPacket;
/// 推送添加单个红包回调
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didAddRedPacket:(QXRedPacketModel *)redPacket remainingCount:(NSInteger)remainingCount;
/// 首次获取房间内红包列表进行添加后回调
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didAddRedPackets:(NSArray<QXRedPacketModel *>*)redPackets remainingCount:(NSInteger)remainingCount;
/// 红包从列表移除后的回调
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didRemoveRedPacket:(NSString *)packetId remainingCount:(NSInteger)remainingCount;
/// 红包状态发生变化时回调(由不可抢到可抢)
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didUpdateRedPacket:(QXRedPacketModel *)redPacket remainingCount:(NSInteger)remainingCount;
/// 红包状态发生变化时回调(由不可抢到可抢)
- (void)QXRedPacketManager:(QXRedPacketManager *)manager didUpdateRedPacketTime:(long)time redPacket:(QXRedPacketModel *)redPacket;
@end
@interface QXRedPacketManager : NSObject
@@ -20,16 +27,24 @@
@property (nonatomic, weak) id<QXRedPacketManagerDelegate> delegate;
+ (instancetype)sharedManager;
/// 批量添加红包
- (void)addRedPackets:(NSArray<QXRedPacketModel *>*)redPackets;
/// 添加红包
- (void)addRedPacket:(QXRedPacketModel *)redPacket;
/// 移除红包
- (void)removeRedPacket:(NSString *)packetId;
/// 获取所有红包
- (NSArray<QXRedPacketModel *> *)allRedPackets;
/// 根据位置获取红包
- (QXRedPacketModel *)redPacketAtPosition:(NSInteger)position;
/// 根据红包id获取红包
- (QXRedPacketModel *)getRedPacket:(NSString *)packetId;
/// 检查并更新红包状态
- (void)checkAndUpdateRedPackets;
/// 移除所有红包
-(void)removeAllRedpackets;
/// 开启定时器
-(void)startCheckTimer;
/// 销毁定时器
-(void)endCheckTimer;
/// 回收内存
-(void)destoryRedpacketInfo;
@end

View File

@@ -27,26 +27,35 @@
self = [super init];
if (self) {
_redPackets = [NSMutableDictionary dictionary];
[self startCheckTimer];
}
return self;
}
-(void)addRedPackets:(NSArray<QXRedPacketModel *> *)redPackets{
if (redPackets.count == 0) {
return;
}
for (QXRedPacketModel*md in redPackets) {
self.redPackets[md.redpacket_id] = md;
}
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPackets:remainingCount:)]) {
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didAddRedPackets:redPackets remainingCount:self.redPackets.count];
}
}
- (void)addRedPacket:(QXRedPacketModel *)redPacket {
if (!redPacket.redpacket_id) return;
self.redPackets[redPacket.redpacket_id] = redPacket;
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:)]) {
[self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:)];
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didAddRedPacket:remainingCount:)]) {
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didAddRedPacket:redPacket remainingCount:self.redPackets.count];
}
}
- (void)removeRedPacket:(NSString *)packetId {
[self.redPackets removeObjectForKey:packetId];
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didRemoveRedPacket:)]) {
[self.delegate QXRedPacketManager:self didRemoveRedPacket:packetId];
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didRemoveRedPacket:remainingCount:)]) {
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didRemoveRedPacket:packetId remainingCount:self.redPackets.count];
}
}
@@ -54,13 +63,8 @@
return [self.redPackets allValues];
}
- (QXRedPacketModel *)redPacketAtPosition:(NSInteger)position {
for (QXRedPacketModel *packet in self.redPackets.allValues) {
if (packet.position == position) {
return packet;
}
}
return nil;
-(QXRedPacketModel *)getRedPacket:(NSString *)packetId{
return [self.redPackets objectForKey:packetId];
}
- (void)startCheckTimer {
@@ -75,27 +79,52 @@
NSArray *packets = [self.allRedPackets copy];
for (QXRedPacketModel *packet in packets) {
//
long packetTime = [packet remainingTime];
if ((packetTime <= -packet.redpacket_time.intValue)) {
// 10
[self removeRedPacket:packet.redpacket_id];
}
if (packet.countdown.intValue == 0) {
continue;
}
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacketTime:redPacket:)]) {
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didUpdateRedPacketTime:packetTime redPacket:packet];
}
BOOL wasAvailable = packet.isAvailable;
packet.isAvailable = [packet canOpenNow];
//
if (wasAvailable != packet.isAvailable) {
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacket:)]) {
[self.delegate QXRedPacketManager:self didUpdateRedPacket:packet];
if ([self.delegate respondsToSelector:@selector(QXRedPacketManager:didUpdateRedPacket:remainingCount:)]) {
[self.delegate QXRedPacketManager:[QXRedPacketManager sharedManager] didUpdateRedPacket:packet remainingCount:self.redPackets.count];
}
}
//
// if (packet.type == RedPacketTypeCountdown && [packet remainingTime] <= -10) {
// // 10
// [self removeRedPacket:packet.packetId];
// }
}
}
-(void)removeAllRedpackets{
[self.redPackets removeAllObjects];
}
-(void)endCheckTimer{
if (self.checkTimer) {
[self.checkTimer invalidate];
self.checkTimer = nil;
}
}
-(void)destoryRedpacketInfo{
[self removeAllRedpackets];
[self endCheckTimer];
self.delegate = nil;
}
- (void)dealloc {
if (self.checkTimer) {
[self.checkTimer invalidate];
self.checkTimer = nil;
}
}
- (void)dealloc {
[self.checkTimer invalidate];
self.checkTimer = nil;
}
@end

View File

@@ -617,7 +617,7 @@
}
break;
case QXRoomMessageTypeSendRedpacket:{
QXRedPacketModel *model = [QXRedPacketModel yy_modelWithJSON:msg.Text];
QXRedPacketModel *model = [QXRedPacketModel yy_modelWithJSON:msg.Text[@"redpacketInfo"]];
if (self.delegate && [self.delegate respondsToSelector:@selector(recievedRedPacket:)]) {
[self.delegate recievedRedPacket:model];
}