bool MailService::sendMail(DWORD h,Cmd::Session::t_sendMail_SceneSession & sm) { if (0==sm.mail.toID && 0==strncmp("",sm.mail.toName,MAX_NAMESIZE)) { Zebra::logger->error("[邮件]sendMoneyMail 收件人为空 fromName=%s money=%u text=%s type=%u",sm.mail.fromName,sm.mail.sendMoney,sm.mail.text,sm.mail.type); return false; } connHandleID handle = (connHandleID)h; if ((connHandleID)-1 == handle) { Zebra::logger->error("[邮件]sendMail: 无效的数据库句柄"); Zebra::logger->error("[邮件]%s->%s 丢失 money=%u item=%s",sm.mail.fromName,sm.mail.toName,sm.mail.sendMoney,sm.item.object.strName); return false; } DWORD retcode = SessionService::dbConnPool->exeInsert(handle,"`MAIL`",mail_define,(const BYTE *)&sm.mail); if ((DWORD)-1 == retcode) { Zebra::logger->error("[邮件]sendMail: 插入新邮件数据库出错 retcode=%d",retcode); Zebra::logger->error("[邮件]%s->%s 丢失 money=%u item=%s",sm.mail.fromName,sm.mail.toName,sm.mail.sendMoney,sm.item.object.strName); return false; } newMailMap[sm.mail.toID].insert(retcode); UserSession * toUser = UserSessionManager::getInstance()->getUserSessionByName(sm.mail.toName); if (toUser) { Cmd::stNotifyNewMail n; toUser->sendCmdToMe(&n,sizeof(n)); } return true; }
bool MailService::sendMail(Cmd::Session::t_sendMail_SceneSession & sm) { connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { Zebra::logger->error("[邮件]sendMail: 得到数据库句柄失败"); Zebra::logger->error("[邮件]%s->%s 丢失 money=%u item=%s",sm.mail.fromName,sm.mail.toName,sm.mail.sendMoney,sm.item.object.strName); return false; } DWORD retcode = SessionService::dbConnPool->exeInsert(handle,"`MAIL`",mail_define,(const BYTE *)&sm.mail); SessionService::dbConnPool->putHandle(handle); if ((DWORD)-1 == retcode) { Zebra::logger->error("[邮件]sendMail: 插入新邮件数据库出错 retcode=%d",retcode); Zebra::logger->error("[邮件]%s->%s 丢失 money=%u item=%s",sm.mail.fromName,sm.mail.toName,sm.mail.sendMoney,sm.item.object.strName); return false; } newMailMap[sm.mail.toID].insert(retcode); UserSession * toUser = UserSessionManager::getInstance()->getUserSessionByName(sm.mail.toName); if (toUser) { Cmd::stNotifyNewMail n; toUser->sendCmdToMe(&n,sizeof(n)); } return true; }
/** * \brief 发送私聊消息给好友,如果对方不在则存为离线消息 * \param pCmd 聊天消息 * \param cmdLen 消息长度 * \return */ void CRelationManager::sendPrivateChatToFriend(const Cmd::stChannelChatUserCmd *pCmd,const DWORD cmdLen) { //rwlock.rdlock(); CRelation *rel = (CRelation *)getEntryByName(pCmd->pstrName); if (rel) { BYTE buf[x_socket::MAX_DATASIZE]; Cmd::stChannelChatUserCmd *chatCmd; chatCmd = (Cmd::stChannelChatUserCmd *)buf; memcpy(chatCmd,pCmd,cmdLen,sizeof(buf)); strncpy(chatCmd->pstrName,user->name,MAX_NAMESIZE); if (rel->isOnline()) { UserSession *pUser = UserSessionManager::getInstance()->getUserByID(rel->id); if (pUser) pUser->sendCmdToMe(chatCmd,cmdLen); } else { COfflineMessage::writeOfflineMessage(chatCmd->dwType,rel->id,chatCmd,cmdLen); } } //rwlock.unlock(); }
/** * \brief 发送聊天消息给自己的所有简单社会关系,如果不在线则存为离线消息 * \param pCmd 聊天消息 * \param cmdLen 消息长度 */ void CRelationManager::sendChatToMyFriend(const Cmd::stChannelChatUserCmd *pCmd,const DWORD cmdLen) { //rwlock.rdlock(); user->sendCmdToMe(pCmd,cmdLen); // 转发一条消息给自己,以免看不到自己的聊天记录 for(zEntryName::hashmap::iterator it=zEntryName::ets.begin();it!=zEntryName::ets.end();it++) { CRelation *temp = (CRelation *)it->second; if (temp && (temp->type != Cmd::RELATION_TYPE_BAD)&& (temp->type != Cmd::RELATION_TYPE_ENEMY)) { if (temp->online) { UserSession *pUser = UserSessionManager::getInstance()->getUserByID(temp->id); if (pUser) pUser->sendCmdToMe(pCmd,cmdLen); } else { if (Cmd::CHAT_TYPE_FRIEND_AFFICHE == pCmd->dwChannelID) { COfflineMessage::writeOfflineMessage(pCmd->dwType,user->id,pCmd,cmdLen); } } } } //rwlock.unlock(); }
bool SessionChannel::sendCmdToAll(const void *cmd,int len) { UserSession * user = 0; for (std::list<DWORD>::iterator it=userList.begin(); it!=userList.end(); it++) { user = UserSessionManager::getInstance()->getUserByTempID(*it); if (user) { user->sendCmdToMe(cmd,len); } } return true; }
bool SessionChannel::sendToOthers(UserSession *pUser,const Cmd::stChannelChatUserCmd *cmd,DWORD len) { UserSession * user = 0; for (std::list<DWORD>::iterator it=userList.begin(); it!=userList.end(); it++) { user = UserSessionManager::getInstance()->getUserByTempID(*it); if (user && user!=pUser) { user->sendCmdToMe(cmd,len); } } return true; }
/** * \brief 发送消息给自己的所有简单社会关系 * \param pCmd 消息 * \param cmdLen 消息长度 * \param sendMe 是否发给自己 */ void CRelationManager::sendCmdToMyFriendExcept(const void *pCmd,const DWORD cmdLen,bool sendMe,const char * except) { //rwlock.rdlock(); if (sendMe) user->sendCmdToMe(pCmd,cmdLen); // 转发一条消息给自己 for(zEntryName::hashmap::iterator it=zEntryName::ets.begin();it!=zEntryName::ets.end();it++) { CRelation *temp = (CRelation *)it->second; if (temp && (temp->type != Cmd::RELATION_TYPE_BAD) && (temp->type != Cmd::RELATION_TYPE_ENEMY)) { if (temp->online) { UserSession *pUser = UserSessionManager::getInstance()->getUserByID(temp->id); if (pUser && strncmp(pUser->name,except,MAX_NAMESIZE)) { pUser->sendCmdToMe(pCmd,cmdLen); } } } } //rwlock.unlock(); }
/* \brief 退回一封邮件 * \param mailID 邮件ID * */ bool MailService::turnBackMail(DWORD mailID) { using namespace Cmd::Session; connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { Zebra::logger->error("[邮件]turnBackMail: 得到数据库句柄失败"); return false; } char where[128]; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",mailID); mailTurnBackInfo mail; DWORD retcode = SessionService::dbConnPool->exeSelectLimit(handle,"`MAIL`",mail_turnback_define,where,NULL,1,(BYTE*)&mail); if (1 != retcode || mail.state==MAIL_STATE_DEL || mail.type!=MAIL_TYPE_MAIL || mail.accessory!=1 || mail.itemGot!=0 || (0==mail.fromID && 0==strncmp("",mail.fromName,MAX_NAMESIZE))) //|| 0==strncmp("",mail.fromName,MAX_NAMESIZE) //|| 0==mail.fromID) { Zebra::logger->error("[邮件]不能退还邮件 mailID=%u retCode=%d",mailID,retcode); SessionService::dbConnPool->putHandle(handle); return false; } char temp[MAX_NAMESIZE]; mail.state = MAIL_STATE_NEW; strncpy(temp,mail.fromName,MAX_NAMESIZE); strncpy(mail.fromName,mail.toName,MAX_NAMESIZE); strncpy(mail.toName,temp,MAX_NAMESIZE); strncpy(mail.title,"退回的物品",MAX_NAMESIZE); mail.type = MAIL_TYPE_RETURN; zRTime ct; mail.createTime = ct.sec(); mail.delTime = mail.createTime + 60*60*24*7; _snprintf(mail.text,255-1,"%s 谢绝了你发送的物品",mail.fromName); mail.recvMoney = 0; mail.recvGold = 0; DWORD t = mail.fromID; mail.fromID = mail.toID; mail.toID = t; retcode = SessionService::dbConnPool->exeUpdate(handle,"`MAIL`",mail_turnback_define,(BYTE*)&mail,where); SessionService::dbConnPool->putHandle(handle); if (1 != retcode) { Zebra::logger->error("[邮件]返还邮件Update失败:mailID=%u,retcode=%d",mailID,retcode); return false; } UserSession * toUser = UserSessionManager::getInstance()->getUserSessionByName(mail.toName); if (toUser) { Cmd::stNotifyNewMail n; toUser->sendCmdToMe(&n,sizeof(n)); } return true; }
bool MailService::doMailCmd(const Cmd::t_NullCmd *cmd,const DWORD cmdLen) { using namespace Cmd; using namespace Cmd::Session; switch (cmd->para) { case PARA_SCENE_SENDMAIL: { t_sendMail_SceneSession * rev = (t_sendMail_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserSessionByName(rev->mail.fromName); if (!pUser) pUser = UserSessionManager::getInstance()->getUserByID(rev->mail.fromID); /*//取消这个身份确认,避免一些物品丢失 if (!pUser && rev->mail.type!=Cmd::Session::MAIL_TYPE_ACTIVITY) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_SENDMAIL): 发送邮件时未找到发送者 %s",rev->mail.fromName); return true; } */ if (sendMail(* rev)) { if (pUser) pUser->sendSysChat(Cmd::INFO_TYPE_GAME,"发送成功"); Zebra::logger->info("[邮件]邮件发送成功 %s->%s(%u)",rev->mail.fromName,rev->mail.toName,rev->mail.toID); UserSession * toUser = UserSessionManager::getInstance()->getUserSessionByName(rev->mail.toName); if (!toUser) toUser = UserSessionManager::getInstance()->getUserByID(rev->mail.toID); if (toUser) { Cmd::stNotifyNewMail n; toUser->sendCmdToMe(&n,sizeof(n)); } } return true; } break; case PARA_SCENE_GET_MAIL_LIST: { t_getMailList_SceneSession * rev = (t_getMailList_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->tempID); if (!pUser) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_GET_MAIL_LIST): 取得邮件列表时未找到玩家"); return true; } connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"取得邮件失败"); Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_GET_MAIL_LIST): 得到数据库句柄失败"); return true; } char where[128]; //得到邮件列表 bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"TOID=%u",pUser->id); mailHeadInfo *mailList; DWORD retcode = SessionService::dbConnPool->exeSelect(handle,"`MAIL`",mail_head_define,where,"DELTIME DESC",(BYTE **)&mailList); SessionService::dbConnPool->putHandle(handle); if (mailList) { for (DWORD i=0; i< retcode; i++) { if (mailList[i].state==MAIL_STATE_DEL) continue; stAddListMail al; al.id = mailList[i].id; al.state = mailList[i].state; if (MAIL_TYPE_AUCTION==mailList[i].type || MAIL_TYPE_SYS==mailList[i].type) al.type=1;//系统邮件 strncpy(al.fromName,mailList[i].fromName,MAX_NAMESIZE); if (mailList[i].accessory && !mailList[i].itemGot) al.accessory = true; else al.accessory = false; zRTime ct; al.endTime = mailList[i].delTime>ct.sec()?mailList[i].delTime-ct.sec():0; pUser->sendCmdToMe(&al,sizeof(al)); } } SAFE_DELETE_VEC(mailList); /* //得到邮件列表 std::string escapeName; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"TONAME='%s'",pUser->name); retcode = SessionService::dbConnPool->exeSelect(handle,"`MAIL`",mail_head_define,where,"DELTIME DESC",(BYTE **)&mailList); SessionService::dbConnPool->putHandle(handle); if (mailList) { for (DWORD i=0; i< retcode; i++) { if (mailList[i].state==MAIL_STATE_DEL || strncmp(mailList[i].toName,pUser->name,MAX_NAMESIZE)) continue; stAddListMail al; al.id = mailList[i].id; al.state = mailList[i].state; strncpy(al.fromName,mailList[i].fromName,MAX_NAMESIZE); if (mailList[i].accessory && !mailList[i].itemGot) al.accessory = true; else al.accessory = false; zRTime ct; al.endTime = mailList[i].delTime>ct.sec()?mailList[i].delTime-ct.sec():0; pUser->sendCmdToMe(&al,sizeof(al)); } } SAFE_DELETE_VEC(mailList); */ return true; } break; case PARA_SCENE_OPEN_MAIL: { t_openMail_SceneSession * rev = (t_openMail_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->tempID); if (!pUser) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_OPEN_MAIL): 打开邮件时未找到玩家"); return true; } connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"打开邮件失败"); Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_OPEN_MAIL): 得到数据库句柄失败"); return true; } std::string escapeName; char where[128]; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",rev->mailID); mailContentInfo content; DWORD retcode = SessionService::dbConnPool->exeSelectLimit(handle,"`MAIL`",mail_content_define,where,NULL,1,(BYTE*)&content); if (1 != retcode ||content.state==MAIL_STATE_DEL ||(strncmp(content.toName,pUser->name,MAX_NAMESIZE) && content.toID!=pUser->id)) { SessionService::dbConnPool->putHandle(handle); return true; } if (content.state==MAIL_STATE_NEW) { mailStateInfo st; st.state = MAIL_STATE_OPENED; retcode = SessionService::dbConnPool->exeUpdate(handle,"`MAIL`",mail_state_define,(BYTE*)&st,where); newMailMap[content.toID].erase(rev->mailID);//从新邮件列表里删除 } SessionService::dbConnPool->putHandle(handle); stContentMail cm; cm.mailID = content.id; strncpy(cm.title,content.title,MAX_NAMESIZE); strncpy(cm.text,content.text,256); if (content.accessory>0 && content.itemGot==0) { cm.accessory = true; cm.sendMoney = content.sendMoney; cm.recvMoney = content.recvMoney; cm.sendGold = content.sendGold; cm.recvGold = content.recvGold; bcopy(&content.item.object,&cm.item,sizeof(t_Object),sizeof(cm.item)); } else { cm.accessory = false; } pUser->sendCmdToMe(&cm,sizeof(cm)); #ifdef _DEBUG //Zebra::logger->debug("[邮件]%s 打开邮件 id=%u 物品:thisID=%u ObjectID=%u",pUser->name,cm.mailID,cm.item.qwThisID,cm.item.dwObjectID); #endif return true; } break; case PARA_SCENE_GET_MAIL_ITEM: { t_getMailItem_SceneSession * rev = (t_getMailItem_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->tempID); if (!pUser) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_GET_MAIL_ITEM): 获取附件时未找到玩家"); return true; } connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"获取附件失败"); Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_GET_MAIL_ITEM): 得到数据库句柄失败"); return true; } std::string escapeName; char where[128]; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",rev->mailID); mailContentInfo content; DWORD retcode = SessionService::dbConnPool->exeSelectLimit(handle,"`MAIL`",mail_content_define,where,NULL,1,(BYTE*)&content); if (1 != retcode ||content.state==MAIL_STATE_DEL ||content.accessory!=1 ||content.itemGot==1 ||(strncmp(content.toName,pUser->name,MAX_NAMESIZE) && content.toID!=pUser->id)) { //pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"不能获取附件"); SessionService::dbConnPool->putHandle(handle); return true; } if (content.item.object.qwThisID!=0 && rev->space==0) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你的包裹空间不足"); SessionService::dbConnPool->putHandle(handle); return true; } if (content.sendMoney && rev->money+content.sendMoney>10000000) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你的银币超过了上限,不能领取附件"); SessionService::dbConnPool->putHandle(handle); return true; } if (content.sendGold && rev->gold+content.sendGold>10000000) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你的金币超过了上限,不能领取附件"); SessionService::dbConnPool->putHandle(handle); return true; } if (content.recvMoney>rev->money) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你的银币不够,不能领取附件"); SessionService::dbConnPool->putHandle(handle); return true; } if (content.recvGold>rev->gold) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你的金币不够,不能领取附件"); SessionService::dbConnPool->putHandle(handle); return true; } content.itemGot = 1; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",rev->mailID); retcode = SessionService::dbConnPool->exeUpdate(handle,"`MAIL`",mail_content_define,(BYTE*)&content,where); SessionService::dbConnPool->putHandle(handle); t_getMailItemReturn_SceneSession gmir; gmir.userID = pUser->tempid; gmir.mailID = rev->mailID; gmir.sendMoney = content.sendMoney; gmir.recvMoney = content.recvMoney; gmir.sendGold = content.sendGold; gmir.recvGold = content.recvGold; bcopy(&content.item,&gmir.item,sizeof(Cmd::Session::SessionObject),sizeof(gmir.item)); pUser->scene->sendCmd(&gmir,sizeof(gmir)); return true; } break; case PARA_SCENE_GET_MAIL_ITEM_CONFIRM: { t_getMailItemConfirm_SceneSession * rev = (t_getMailItemConfirm_SceneSession *)cmd; /* //已经收取附件成功 UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->userID); if (!pUser) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_GET_MAIL_ITEM_CONFIRM): 确认获取附件时未找到玩家"); return true; } */ connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_GET_MAIL_ITEM_CONFIRM): 得到数据库句柄失败"); return true; } char where[128]; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",rev->mailID); mailInfo mail; DWORD retcode = SessionService::dbConnPool->exeSelectLimit(handle,"`MAIL`",mail_define,where,NULL,1,(BYTE*)&mail); if (1 != retcode) { if (retcode!=0) Zebra::logger->error("[邮件]%s 确认获取附件错误 mailID=%u retCode=%d",mail.toName,rev->mailID,retcode); SessionService::dbConnPool->putHandle(handle); return true; } if (mail.recvMoney) if (!sendMoneyMail(mail.toName,mail.toID,mail.fromName,mail.fromID,mail.recvMoney,"支付给你的银子")) { Zebra::logger->error("[邮件]%s 支付银子失败 mailID=%u",mail.toName,rev->mailID); } //BYTE i = 1; //retcode = SessionService::dbConnPool->exeUpdate(handle,"`MAIL`",mail_item_define,&i,where); SessionService::dbConnPool->putHandle(handle); //if ((DWORD)-1 == retcode || 0 == retcode) // Zebra::logger->error("[邮件]%s 确认获取附件错误 mailID=%u retCode=%d",mail.toName,rev->mailID,retcode); return true; } break; case PARA_SCENE_DEL_MAIL: { t_delMail_SceneSession * rev = (t_delMail_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->tempID); if (!pUser) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_DEL_MAIL): 删除邮件时未找到玩家"); return true; } connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_DEL_MAIL): 得到数据库句柄失败"); return true; } char where[128]; mailContentInfo st; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",rev->mailID); DWORD retcode = SessionService::dbConnPool->exeSelectLimit(handle,"`MAIL`",mail_content_define,where,NULL,1,(BYTE*)&st); if (1!=retcode ||st.state==MAIL_STATE_DEL ||(st.accessory==1 && st.itemGot==0) ||(strncmp(st.toName,pUser->name,MAX_NAMESIZE) && st.toID!=pUser->id)) { if (st.accessory==1 && st.itemGot==0) pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你不能删除带附件的邮件"); SessionService::dbConnPool->putHandle(handle); return true; } st.state = MAIL_STATE_DEL; retcode = SessionService::dbConnPool->exeUpdate(handle,"`MAIL`",mail_content_define,(BYTE*)&st,where); if (1 != retcode) Zebra::logger->error("[邮件]删除邮件失败:mailID=%u,retcode=%u",rev->mailID,retcode); stDelMail dm; dm.mailID = rev->mailID; pUser->sendCmdToMe(&dm,sizeof(dm)); Zebra::logger->info("[邮件]%s 删除邮件 mailID=%u",pUser->name,rev->mailID); SessionService::dbConnPool->putHandle(handle); return true; } break; case PARA_SCENE_CHECK_NEW_MAIL: { t_checkNewMail_SceneSession * rev = (t_checkNewMail_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->userID); if (!pUser) return true; if (0==newMailMap[pUser->id].size()) return true; Cmd::stNotifyNewMail n; pUser->sendCmdToMe(&n,sizeof(n)); return true; } break; case PARA_SCENE_TURN_BACK_MAIL: { t_turnBackMail_SceneSession * rev = (t_turnBackMail_SceneSession *)cmd; UserSession * pUser = UserSessionManager::getInstance()->getUserByTempID(rev->userID); if (!pUser) { Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_TURN_BACK_MAIL): 退回邮件时未找到玩家"); return true; } connHandleID handle = SessionService::dbConnPool->getHandle(); if ((connHandleID)-1 == handle) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"退回邮件失败"); Zebra::logger->error("[邮件]doMailCmd(PARA_SCENE_TURN_BACK_MAIL): 得到数据库句柄失败"); return true; } char where[128]; bzero(where,sizeof(where)); _snprintf(where,sizeof(where) - 1,"ID=%u",rev->mailID); mailTurnBackInfo info; DWORD retcode = SessionService::dbConnPool->exeSelectLimit(handle,"`MAIL`",mail_turnback_define,where,NULL,1,(BYTE*)&info); SessionService::dbConnPool->putHandle(handle); if (1!=retcode ||info.state==MAIL_STATE_DEL ||info.type==MAIL_TYPE_RETURN ||info.accessory!=1 ||info.itemGot!=0 ||(strncmp(info.toName,pUser->name,MAX_NAMESIZE) && info.toID!=pUser->id)) { pUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"不能退还该邮件"); return true; } if (turnBackMail(rev->mailID)) { stDelMail dm; dm.mailID = rev->mailID; pUser->sendCmdToMe(&dm,sizeof(dm)); Zebra::logger->info("[邮件]%s 退回 %s 的邮件 mailID=%u",pUser->name,info.fromName,rev->mailID); } return true; } break; default: break; } return false; }
/** * \brief 处理Gateway转发过来的客户端消息 * \param pNullCmd 消息体 * \param cmdLen 消息长度 * \return true 处理完毕,false 不在处理范围之中 */ bool CRelationManager::processUserMessage(const Cmd::stNullUserCmd *pNullCmd,const DWORD cmdLen) { switch(pNullCmd->byCmd) { case Cmd::RELATION_USERCMD: { switch(pNullCmd->byParam) { case UNMARRY_PARA: { CRelation* relation = NULL; relation = getMarryRelation(); if (relation) { UserSession *otherUser = NULL; otherUser = UserSessionManager::getInstance()->getUserSessionByName(relation->name); if (otherUser) { removeRelation(relation->name); otherUser->relationManager.removeRelation(user->name); otherUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"%s选择和你离婚",user->name); otherUser->updateConsort(); } else { CRelation *tRelation = NULL; tRelation = (CRelation *)getEntryByName(relation->name); if (tRelation) writeOfflineNotify(tRelation); removeRelation(relation->name); } user->updateConsort(); } } break; case Cmd::RELATION_STATUS_PARA: { Cmd::stRelationStatusCmd *rev = (Cmd::stRelationStatusCmd *)pNullCmd; switch(rev->byState) { case Cmd::RELATION_ADD: { if (!strncmp(rev->name,user->name,MAX_NAMESIZE)) { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"不能把自己加入名单中?"); return true; } if (300>size()) { if (rev->type == Cmd::RELATION_TYPE_BAD) { addBadRelation(rev->name); } else { addEnemyRelation(rev->name); } } else { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"名单列表已满!"); } return true; } break; case Cmd::RELATION_ANSWER_NO: { UserSession *otherUser = NULL; otherUser = UserSessionManager::getInstance()->getUserByID(rev->userid); if (otherUser) { switch(rev->type) { case Cmd::RELATION_TYPE_FRIEND: { otherUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方不同意与你结为好友"); return true; } break; case Cmd::RELATION_TYPE_LOVE: { otherUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方不同意与你结为夫妻"); } break; default: break; } } } break; case Cmd::RELATION_ANSWER_YES: { UserSession *otherUser = NULL; otherUser = UserSessionManager::getInstance()->getUserByID(rev->userid); if (otherUser) { if (300>otherUser->relationManager.size()|| rev->type == Cmd::RELATION_TYPE_LOVE) { if (300>size() || rev->type == Cmd::RELATION_TYPE_LOVE) { addRelation(rev->userid,rev->type); otherUser->relationManager.addRelation(user->id,rev->type); if (rev->type != Cmd::RELATION_TYPE_LOVE) { otherUser->sendSysChat(Cmd::INFO_TYPE_ADDFRIEND,"你与 %s 义结金兰,成为好友",user->name); user->sendSysChat(Cmd::INFO_TYPE_ADDFRIEND,"你与 %s 义结金兰,成为好友",otherUser->name); } } else { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"我的好友列表已满"); otherUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方好友列表已满"); } } else { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方好友列表已满"); otherUser->sendSysChat(Cmd::INFO_TYPE_FAIL,"你的好友列表已满"); } } } break; case Cmd::RELATION_QUESTION: //free 禁止好友功能 // user->sendSysChat(Cmd::INFO_TYPE_FAIL, "好友系统正在开 发中!"); // break; //#if 0 { if (!strncmp(rev->name,user->name,MAX_NAMESIZE)) { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"你在开玩笑吗?加自己为好友!"); return true; } CRelation *relation = NULL; relation = (CRelation *)getEntryByName(rev->name); if (relation) { if (!strncmp(rev->name,relation->name,MAX_NAMESIZE) && Cmd::RELATION_TYPE_BAD != relation->type) { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方已经在你的好友列表中了,无需再添加!"); return true; } } UserSession *otherUser = NULL; otherUser = UserSessionManager::getInstance()->getUserSessionByName(rev->name); if (otherUser) { if (isset_state(otherUser->sysSetting,Cmd::USER_SETTING_FRIEND)) { user->sendSysChat(Cmd::INFO_TYPE_GAME,"好友请求已发送,等待对方应答!"); rev->userid = user->id; strncpy(rev->name,user->name,MAX_NAMESIZE); otherUser->sendCmdToMe(rev,sizeof(Cmd::stRelationStatusCmd)); } else user->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方添加好友未开启"); } else { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"对方不在线不能响应你的邀请"); } //#endif break; } case Cmd::RELATION_REMOVE: { CRelation *rel = NULL; rel = (CRelation *)getEntryByName(rev->name); if (!rel) return true; int type = rel->type; if (Cmd::RELATION_TYPE_BAD == type || Cmd::RELATION_TYPE_ENEMY == type) { removeRelation(rev->name); // 删除黑名单成员 } else { if (Cmd::RELATION_TYPE_LOVE == type) { user->sendSysChat(Cmd::INFO_TYPE_FAIL,"你必须到民政官那里去办理离婚手续!"); return true; } UserSession *otherUser = NULL; otherUser = UserSessionManager::getInstance()->getUserSessionByName(rev->name); if (otherUser) { removeRelation(rev->name); otherUser->relationManager.removeRelation(user->name); otherUser->sendSysChat(Cmd::INFO_TYPE_BREAKFRIEND,"%s选择与你割席断交",user->name); user->sendSysChat(Cmd::INFO_TYPE_BREAKFRIEND,"你选择与 %s 割席断交",otherUser->name); otherUser->updateConsort(); } else { user->sendSysChat(Cmd::INFO_TYPE_BREAKFRIEND,"你选择与 %s 割席断交",rev->name); CRelation *relation = NULL; relation = (CRelation *)getEntryByName(rev->name); if (relation) writeOfflineNotify(relation); removeRelation(rev->name); } user->updateConsort(); } } break; } return true; } break; default: break; } } break; default: break; } return false; }