Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
/**
* \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();
}
Ejemplo n.º 4
0
/**
* \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();
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
/**
* \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();
}
Ejemplo n.º 8
0
/* \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;
}
Ejemplo n.º 9
0
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;
}
Ejemplo n.º 10
0
/**
* \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;
}