123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655 |
- //
- // JXFriendObject.m
- //
- // Created by Reese on 13-8-11.
- // Copyright (c) 2013年 Reese. All rights reserved.
- //
- #import "JXFriendObject.h"
- #import "FMDatabase.h"
- #import "FMResultSet.h"
- #import "AppDelegate.h"
- #import "SBJsonParser.h"
- #import "SaveOrReadArr.h"
- @interface JXFriendObject ()
- @property (nonatomic, assign) BOOL isNewFriend;
- @property (nonatomic,strong) NSTimer *timerFriend;
- @end
- @implementation JXFriendObject
- static JXFriendObject *sharedUser;
- +(JXFriendObject*)sharedInstance{
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedUser=[[JXFriendObject alloc]init];
- });
- return sharedUser;
- }
- -(id)init{
- self = [super init];
- if(self){
-
- // _timerFriend=[NSTimer timerWithTimeInterval:1 target:self selector:@selector(resultShow) userInfo:@"11" repeats:YES];
-
- // [[NSRunLoop mainRunLoop] addTimer:_timerFriend forMode:NSRunLoopCommonModes];
-
- _tableName = @"newFriend";
- }
- return self;
- }
- - (void)resultShow{
-
-
- }
- -(void)dealloc{
- NSLog(@"JXFriendObject.dealloc");
- // [super dealloc];
- }
- -(BOOL)insert{
- self.roomFlag = [NSNumber numberWithInt:0];
- self.companyId = [NSNumber numberWithInt:0];
- self.offlineNoPushMsg = [NSNumber numberWithInt:0];
- self.talkTime = [NSNumber numberWithLong:0];
- return [super insert];
- }
- - (BOOL)update {
- if (!self.content || self.content.length <= 0) {
- self.content = [self getLastContent:self.userId];
- }
-
- return [super update];
- }
- -(JXFriendObject*)userFromDictionary:(NSDictionary*)aDic
- {
- JXFriendObject* user = [[JXFriendObject alloc]init];
- [super userFromDictionary:user dict:aDic];
- return user;
- }
- -(NSMutableArray*)fetchAllFriendsFromLocal
- {
- NSString* sql = @"select a.*,b.status as trueStatus from newfriend as a LEFT JOIN friend as b on a.userId=b.userId order by a.timeCreate desc";
- return [self doFetch:sql];
- }
- -(NSMutableArray*)doFetch:(NSString*)sql
- {
- NSMutableArray *resultArr=[[NSMutableArray alloc]init];
-
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [super checkTableCreatedInDb:db];
-
- FMResultSet *rs=[db executeQuery:sql];
- while ([rs next]) {
- JXFriendObject *user=[[JXFriendObject alloc] init];
- [super userFromDataset:user rs:rs];
- [resultArr addObject:user];
- // [user release];
- }
- [rs close];
- if([resultArr count]==0){
- // [resultArr release];
- resultArr = nil;
- }
- return resultArr;
- }
- -(void)notifyNewRequest{
- //发送全局通知
- [g_notify postNotificationName:kXMPPNewRequestNotifaction object:self userInfo:nil];
- }
- -(void)doSaveUser{
- // [self update];
-
- JXUserObject* user = [[JXUserObject alloc]init];
- [user loadFromObject:self];
- user.status = self.status;
- user.msgsNew = [NSNumber numberWithInt:0];
- user.content = nil;//很重要,必须有
- if([user haveTheUser]) {
- JXUserObject *oldUser = [[JXUserObject sharedInstance] getUserById:user.userId];
- user.userType = oldUser.userType;
-
- [user update];
- }
- else{
- [user insert];
- [user notifyNewFriend];
- }
- // [user release];
- }
- //- (void)doSaveAddressBook{
- // NSDictionary *dict = (NSDictionary *)self.content;
- // JXAddressBook *addressBook = [[JXAddressBook alloc] init];
- // addressBook.toUserId = [NSString stringWithFormat:@"%@",dict[@"toUserId"]];
- // addressBook.toUserName = dict[@"toUserName"];
- // addressBook.toTelephone = dict[@"toTelephone"];
- // addressBook.telephone = dict[@"telephone"];
- // addressBook.registerEd = dict[@"registerEd"];
- // addressBook.registerTime = [NSDate dateWithTimeIntervalSince1970:[dict[@"registerTime"] longLongValue]];
- // addressBook.isRead = [NSNumber numberWithBool:0];
- // [addressBook insert];
- //}
- -(void)doDelUser{
- self.status = [NSNumber numberWithInt:friend_status_none];
- [self update];
- [JXUserObject deleteUserAndMsg:self.userId];
- }
- -(NSString*)doMsgForNewUser{
- NSString* s;
-
-
- JXMessageObject* p = [[JXMessageObject alloc] init];
- if([self.isMySend boolValue]){
- p.fromUserId = MY_USER_ID;
- p.fromUserName = g_server.myself.userNickname;
- p.toUserId = self.userId;
- s = Localized(@"JXFriendObject_ChatNow");
- p.isMySend = YES;
- }else{
- p.fromUserId = self.userId;
- p.fromUserName = self.userNickname;
- p.toUserId = MY_USER_ID;
- s = Localized(@"JXFriendObject_StartChat");
- p.isMySend = NO;
- }
- if ([self.type intValue] == XMPP_TYPE_FRIEND) {
- p.fromUserId = self.userId;
- p.toUserId = MY_USER_ID;
- if ([self.isMySend boolValue]) {
- p.fromUserId = MY_USER_ID;
- p.toUserId = self.userId;
- }
- s = Localized(@"JXFriendObject_AddedFriend");
- }
-
- JXUserObject *serverUser = [[JXUserObject sharedInstance] getUserById:self.userId];
- if ([serverUser.userType intValue] == 2) {
- s = @" ";
- }else {
- p.content = s;
- p.type = [NSNumber numberWithInt:kWCMessageTypeText];
- p.isSend = [NSNumber numberWithInt:transfer_status_yes];
- p.isRead = [NSNumber numberWithInt:1];
- p.timeSend = [NSDate date];
- [p insert:nil];
- [p notifyNewMsg];
- }
-
-
- JXUserObject *user = [[JXUserObject alloc] init];
- user.userId = self.userId;
- user.userNickname = self.userNickname;
- user.content = s;
- [user insert];
-
- return s;
- }
- -(void)onSendRequest{
- if(![self.isMySend boolValue])
- return;
- NSNumber* tempStatus=nil;
- JXUserObject* user = [[JXUserObject sharedInstance] getUserById:self.userId];
- if(user)
- tempStatus = user.status;//先记住之前的关系
- switch ([self.type intValue]) {
- case XMPP_TYPE_SAYHELLO:
- if([tempStatus intValue]<=friend_status_none){
- self.status = [NSNumber numberWithInt:friend_status_see];
- [self doSaveUser];
- }
- break;
- case XMPP_TYPE_PASS:
- case XMPP_TYPE_CONTACTFRIEND:
- self.status = [NSNumber numberWithInt:friend_status_friend];
- [self doSaveUser];
- [self doMsgForNewUser];
- [g_notify postNotificationName:kFriendPassNotif object:self];
- break;
- case XMPP_TYPE_FEEDBACK:
- break;
- case XMPP_TYPE_NEWSEE:
- if([tempStatus intValue]<=friend_status_none){//新关注他人时,除非关系小于0,否则都用原来的关系,有可能已为2
- self.status = [NSNumber numberWithInt:friend_status_see];
- [self doSaveUser];
- }
- break;
- case XMPP_TYPE_DELSEE://删除关注
- [self doDelUser];
- break;
- case XMPP_TYPE_SEVERDELFRIEND:
- case XMPP_TYPE_DELALL:
- [self doDelUser];
- break;
- case XMPP_TYPE_SEVERDEL:
- [self doDelUser];
- break;
- case XMPP_TYPE_SEVERBLACK:
- case XMPP_TYPE_BLACK:
- self.status = [NSNumber numberWithInt:friend_status_black];
- [self doSaveUser];//建立黑名单
- [self notifyDelFriend];
- break;
- case XMPP_TYPE_SEVERNOBLACK:
- case XMPP_TYPE_NOBLACK:
- self.status = [NSNumber numberWithInt:friend_status_friend];
- [self doSaveUser];//取消黑名单
- [self doMsgForNewUser];
- break;
- case XMPP_TYPE_FRIEND:
- self.status = [NSNumber numberWithInt:friend_status_friend];
- // 加好友无法获取userType,此处调个接口
- [g_server getUser:self.userId toView:self];
-
- break;
- default:
- break;
- }
- // [user release];
- }
- -(void)onReceiveRequest{
- if([self.isMySend boolValue])
- return;
- NSNumber* tempStatus=nil;
- JXUserObject* user = [[JXUserObject sharedInstance] getUserById:self.userId];
- if(user)
- tempStatus = user.status;//先记住之前的关系
- // if([tempStatus intValue]<friend_status_none){//来者是我的黑名单时,直接忽略
- //// [user release];
- // return;
- // }
-
- switch ([self.type intValue]) {
- case XMPP_TYPE_SAYHELLO:
-
- {
- NSMutableArray *tempAArr= [SaveOrReadArr initNSKeyedFriendUnarchiver];
-
- if (tempAArr.count>0) {
- [tempAArr enumerateObjectsUsingBlock:^(JXUserObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
-
- if ([obj.userId isEqualToString:user.userId]) {
-
- }else{
-
- NSMutableArray *arrxx=[[NSMutableArray alloc]initWithArray:[SaveOrReadArr initNSKeyedFriendUnarchiver]];
- //本地存储
- [arrxx addObject:user];
- [SaveOrReadArr initSerializationFriendArray:arrxx];
-
- }
- }];
- }else{
-
- NSMutableArray *arrxx=[[NSMutableArray alloc]initWithArray:[SaveOrReadArr initNSKeyedFriendUnarchiver]];
- //本地存储
- [arrxx addObject:user];
- [SaveOrReadArr initSerializationTempFriend:arrxx];
- }
-
- [g_notify postNotificationName:@"newFriend" object:nil userInfo:@{@"use":user}];
-
-
- }
- break;
- case XMPP_TYPE_PASS:
- {
-
- NSLog(@"验证通过 %@",user);
- }
- case XMPP_TYPE_CONTACTFRIEND:
- self.status = [NSNumber numberWithInt:friend_status_friend];
- [self doSaveUser];
- [self doMsgForNewUser];
- [g_notify postNotificationName:kFriendPassNotif object:self];
- break;
- case XMPP_TYPE_FEEDBACK:
- break;
- case XMPP_TYPE_NEWSEE:
- if([tempStatus intValue]==friend_status_see){//如果原来已关注,则升级为互粉
- self.status = [NSNumber numberWithInt:friend_status_friend];
- [self doSaveUser];
- }
- break;
- case XMPP_TYPE_DELSEE:
- if([tempStatus intValue]==friend_status_friend){//如果原来已关注,则降级为单方
- self.status = [NSNumber numberWithInt:friend_status_see];
- [self doSaveUser];
- }
- break;
-
- case XMPP_TYPE_SEVERDELFRIEND:
- case XMPP_TYPE_DELALL:
- [self doDelUser];
- break;
- case XMPP_TYPE_SEVERDEL:
- [self doDelUser];
- break;
- case XMPP_TYPE_SEVERBLACK:
- case XMPP_TYPE_BLACK:
- self.status = [NSNumber numberWithInt:friend_status_hisBlack];
- [self doSaveUser];//建立黑名单
- [self notifyDelFriend];
- break;
- case XMPP_TYPE_SEVERNOBLACK:
- case XMPP_TYPE_NOBLACK:
- self.status = [NSNumber numberWithInt:friend_status_friend];
- [self doSaveUser];
- [self doMsgForNewUser];
- break;
- case XMPP_TYPE_FRIEND:
- self.status = [NSNumber numberWithInt:friend_status_friend];
- [self doSaveUser];
- [self doMsgForNewUser];
- break;
-
- // case XMPP_TYPE_CONTACTREGISTER:
- // [self doSaveAddressBook];
- // [g_notify postNotificationName:kRefreshAddressBookNotif object:nil];
- // break;
- default:
- break;
- }
- // [user release];
- }
- -(void)loadFromMessageObj:(JXMessageObject*)msg{
- self.type = msg.type;
- self.content = msg.content;
- self.timeSend = msg.timeSend;
- self.isMySend = [NSNumber numberWithBool:msg.isMySend];
- if([self.isMySend boolValue]){
- self.userId = msg.toUserId;
- self.userNickname = msg.toUserName;
- }else{
- self.userId = msg.fromUserId;
- self.userNickname = msg.fromUserName;
- }
-
- if ([msg.type integerValue] == XMPP_TYPE_SEVERDEL) {
- self.userId = [NSString stringWithFormat:@"%@",msg.objectId];
- NSString *name = [JXUserObject getUserNameWithUserId:self.userId];
- if (name && name.length > 0) {
- self.userNickname = name;
- }
- }
-
- if ([msg.type integerValue] == XMPP_TYPE_SEVERBLACK || [msg.type integerValue] == XMPP_TYPE_SEVERNOBLACK || [msg.type integerValue] == XMPP_TYPE_SEVERDELFRIEND) {
-
- SBJsonParser * resultParser = [[SBJsonParser alloc] init] ;
- NSDictionary *resultObject = [resultParser objectWithString:msg.objectId];
-
- if ([resultObject[@"toUserId"] isEqualToString:MY_USER_ID]) {
- self.userId = resultObject[@"fromUserId"];
- self.userNickname = resultObject[@"fromUserName"];
- self.isMySend = [NSNumber numberWithBool:NO];
- }else {
- self.userNickname = resultObject[@"toUserName"];
- self.userId = resultObject[@"toUserId"];
- self.isMySend = [NSNumber numberWithBool:YES];
- }
- }
-
- JXFriendObject *user = [self selectUser:self.userId];
- self.status = user.status;
- self.msgsNew = user.msgsNew;
- if (user.userNickname.length > 0) {
- self.userNickname = user.userNickname;
- }
- [self insert];
- }
- -(void)doWriteDb{
- if([self.isMySend boolValue])
- [self onSendRequest];
- else
- [self onReceiveRequest];
- }
- -(NSString*)getLastContent:(NSString *)userId{
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- FMResultSet *rs=[db executeQuery:[NSString stringWithFormat:@"select * from %@ where userId=?",_tableName],userId];
- JXFriendObject *user=[[JXFriendObject alloc] init];
- while ([rs next]) {
- [super userFromDataset:user rs:rs];
- }
- [rs close];
-
- return user.content;
- }
- // 查找user
- - (JXFriendObject *)selectUser:(NSString *)userId {
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- [self checkTableCreatedInDb:db];
-
- FMResultSet *rs=[db executeQuery:[NSString stringWithFormat:@"select * from %@ where userId=?",_tableName],userId];
- JXFriendObject *user=[[JXFriendObject alloc] init];
- while ([rs next]) {
- [super userFromDataset:user rs:rs];
- // [user release];
- }
- [rs close];
-
- return user;
- }
- -(JXFriendObject*)getFriendById:(NSString*)userId {
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
-
- FMResultSet *rs=[db executeQuery:[NSString stringWithFormat:@"select * from %@ where userId=?",_tableName],userId];
- if ([rs next]) {
- JXFriendObject *friend=[[JXFriendObject alloc]init];
- [super userFromDataset:friend rs:rs];
- [rs close];
- return friend;
- };
- return nil;
- }
- // 更新新消息
- - (BOOL)updateNewMsgUserId:(NSString *)userId num:(int)num {
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:MY_USER_ID];
- [self checkTableCreatedInDb:db];
- NSString *sql = [NSString stringWithFormat:@"update %@ set newMsgs=? where userId=?",_tableName];
- BOOL worked=[db executeUpdate:sql,[NSNumber numberWithInt:num],userId];
- return worked;
- }
- // 更新新朋友列表最后一条消息
- - (void)updateNewFriendLastContent {
- self.isNewFriend = YES;
- [g_server getUser:self.userId toView:self];
- }
- - (BOOL)updateLastContent:(NSString *)s userId:(NSString *)userId {
- NSString* myUserId = MY_USER_ID;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:myUserId];
- NSString *sql = [NSString stringWithFormat:@"update %@ set content=? where userId=?",_tableName];
- BOOL worked=[db executeUpdate:sql,s,userId];
-
- return worked;
- }
- -(NSString*)getUserNameWithUserId:(NSString*)userId{
- if(userId==nil)
- return nil;
- FMDatabase* db = [[JXXMPP sharedInstance] openUserDb:MY_USER_ID];
- //获取用户名
- NSString* sql= [NSString stringWithFormat:@"select userNickname from %@ where userId=%@",_tableName,userId];
- FMResultSet *rs=[db executeQuery:sql];
- if([rs next]) {
- NSString* s = [rs objectForColumnName:@"userNickname"];
- return s;
- }
-
- return nil;
- }
- -(void) didServerResultSucces:(JXConnection*)aDownload dict:(NSDictionary*)dict array:(NSArray*)array1{
- if([aDownload.action isEqualToString:act_UserGet]){
- JXUserObject *user = [[JXUserObject alloc] init];
- [user getDataFromDict:dict];
- if (self.isNewFriend) {
- self.isNewFriend = NO;
-
- NSString* s = self.content;
- int n = [self.type intValue];
- if([self.isMySend boolValue]){
- switch (n) {
- case XMPP_TYPE_SAYHELLO:
- s= Localized(@"JXFriendObject_WaitPass");
- break;
- case XMPP_TYPE_PASS:
- s = Localized(@"JXFriendObject_Passed");
- break;
- case XMPP_TYPE_FEEDBACK:
- s = self.content;
- break;
- case XMPP_TYPE_NEWSEE:
- s = Localized(@"JXFriendObject_Followed");
- break;
- case XMPP_TYPE_DELSEE:
- s = Localized(@"JXFriendObject_CencalFollowed");
- break;
- case XMPP_TYPE_SEVERDELFRIEND:
- case XMPP_TYPE_DELALL:
- if ([user.userType intValue] == 2) {
- s = [NSString stringWithFormat:@"已取消关注公众号 %@",self.userNickname];
- }else {
- s = [NSString stringWithFormat:@"%@ %@",Localized(@"JXAlert_DeleteFirend"),self.userNickname];
- }
- break;
- case XMPP_TYPE_SEVERDEL:
- s = self.content;
- break;
- case XMPP_TYPE_SEVERBLACK:
- case XMPP_TYPE_BLACK:
- s = [NSString stringWithFormat:@"%@ %@",Localized(@"JXFriendObject_AddedBlackList"),self.userNickname];
- break;
- case XMPP_TYPE_SEVERNOBLACK:
- case XMPP_TYPE_NOBLACK: {
- if (self.isMySend) {
- s = [NSString stringWithFormat:@"我%@",Localized(@"JXFriendObject_NoBlack")];
- }else {
- s = [NSString stringWithFormat:@"%@ %@",MY_USER_NAME,Localized(@"JXFriendObject_NoBlack")];
- }
- }
- break;
- case XMPP_TYPE_FRIEND: {
- if ([user.userType intValue] == 2) {
- s = @"已关注公众号";
- }else {
- s = Localized(@"JXFriendObject_AddedFriend");
- }
- }
- break;
- case XMPP_TYPE_CONTACTFRIEND:
- s = Localized(@"JX_FriendsViaMobileContacts");
- break;
- default:
- break;
- }
- }else{
- switch (n) {
- case XMPP_TYPE_SAYHELLO:
- s = self.content;
- break;
- case XMPP_TYPE_PASS:
- s = Localized(@"JXFriendObject_PassGo");
- break;
- case XMPP_TYPE_FEEDBACK:
- s = self.content;
- break;
- case XMPP_TYPE_NEWSEE:
- s = Localized(@"JXFriendObject_FollowYour");
- break;
- case XMPP_TYPE_DELSEE:
- s = Localized(@"JXFriendObject_CancelFollow");
- break;
- case XMPP_TYPE_SEVERDELFRIEND:
- case XMPP_TYPE_DELALL:
- s = [NSString stringWithFormat:@"%@ %@",self.userNickname,Localized(@"JXFriendObject_Deleted")];
- break;
- case XMPP_TYPE_SEVERDEL:
- s = self.content;
- break;
- case XMPP_TYPE_RECOMMEND:
- s = Localized(@"JXFriendObject_RecomYou");
- break;
- case XMPP_TYPE_SEVERBLACK:
- case XMPP_TYPE_BLACK:
- s = [NSString stringWithFormat:@"%@ %@",self.userNickname,Localized(@"JXFriendObject_PulledBlack")];
- break;
- case XMPP_TYPE_SEVERNOBLACK:
- case XMPP_TYPE_NOBLACK:
- s = [NSString stringWithFormat:@"%@ %@",self.userNickname,Localized(@"JXFriendObject_NoBlack")];
- break;
- case XMPP_TYPE_FRIEND:
- s = Localized(@"JXFriendObject_BeAddFriend");
- break;
- case XMPP_TYPE_CONTACTFRIEND:
- s = Localized(@"JX_FriendsViaMobileContacts");
- break;
- default:
- break;
- }
- }
- // 更新最后一条消息
- [self updateLastContent:s userId:user.userId];
- [self notifyNewRequest];
- return;
- }
-
- if (![user haveTheUser]) {
- [user insert];
- }else {
- [user update];
- }
-
- [self doSaveUser];
- [self doMsgForNewUser];
- [g_notify postNotificationName:kFriendPassNotif object:self];
- // [g_notify postNotificationName:@"newFriend" object:nil userInfo:@{@"use":user}];
- }
- }
- -(int) didServerResultFailed:(JXConnection*)aDownload dict:(NSDictionary*)dict{
- return hide_error;
- }
- -(int) didServerConnectError:(JXConnection*)aDownload error:(NSError *)error{//error为空时,代表超时
- return hide_error;
- }
- -(void) didServerConnectStart:(JXConnection*)aDownload{
- }
- @end
|