Advertisement
smokex

Untitled

Nov 18th, 2013
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. void KviIrcServerParser::parseNumericWhoReply(KviIrcMessage *msg)
  2. {
  3.     // 352: RPL_WHOREPLY [I,E,U,D]
  4.     // :prefix 352 target <chan> <usr> <hst> <srv> <nck> <stat> :<hops> <real>
  5.  
  6.     QString szChan = msg->connection()->decodeText(msg->safeParam(1));
  7.     QString szUser = msg->connection()->decodeText(msg->safeParam(2));
  8.     QString szHost = msg->connection()->decodeText(msg->safeParam(3));
  9.     QString szServ = msg->connection()->decodeText(msg->safeParam(4));
  10.     QString szNick = msg->connection()->decodeText(msg->safeParam(5));
  11.     QString szFlag = msg->connection()->decodeText(msg->safeParam(6));
  12.     bool bAway = szFlag.indexOf('G') != -1;
  13.     bool bIrcOp = szFlag.indexOf('*') != -1;
  14.  
  15.     KviCString trailing = msg->safeTrailing();
  16.     KviCString hops = trailing.getToken(' ');
  17.     bool bHopsOk = false;
  18.     int iHops = hops.toInt(&bHopsOk);
  19.  
  20.     QString szReal = msg->connection()->decodeText(trailing.ptr());
  21.  
  22.     // Update the user entry
  23.     KviIrcUserDataBase * db = msg->connection()->userDataBase();
  24.     KviIrcUserEntry * e = db->find(szNick);
  25.     if(e)
  26.     {
  27.         if(bHopsOk)
  28.             e->setHops(iHops);
  29.         e->setUser(szUser);
  30.         e->setHost(szHost);
  31.         e->setServer(szServ);
  32.         e->setAway(bAway);
  33.         e->setIrcOp(bIrcOp);
  34.         e->setUserFlags(szFlag);
  35.  
  36.         KviQueryWindow * q = msg->connection()->findQuery(szNick);
  37.         if(q)
  38.             q->updateLabelText();
  39.  
  40.         // Check for the avatar unless the entry refers to the local user (in which case
  41.         // the avatar should never be cached nor requested).
  42.         if(!IS_ME(msg,szNick))
  43.         {
  44.             //no avatar? check for a cached one
  45.             if(!e->avatar())
  46.             {
  47.                 // FIXME: #warning "THE AVATAR SHOULD BE RESIZED TO MATCH THE MAX WIDTH/HEIGHT"
  48.                 // maybe now we can match this user ?
  49.                 msg->console()->checkDefaultAvatar(e,szNick,szUser,szHost);
  50.             }
  51.             //still no avatar? check if the user is exposing the fact that he's got one
  52.             if(!e->avatar())
  53.             {
  54.                 if((szReal[0].unicode() == KviControlCodes::Color) && (szReal[1].unicode() & 4) && (szReal[2].unicode() == KviControlCodes::Reset))
  55.                 {
  56.                     if(KVI_OPTION_BOOL(KviOption_boolRequestMissingAvatars) && !e->avatarRequested())
  57.                     {
  58.                         QByteArray d = msg->connection()->encodeText(szNick);
  59.                         msg->connection()->sendFmtData("%s %s :%c%s%c","PRIVMSG",d.data(),0x01,"AVATAR",0x01);
  60.                         e->setAvatarRequested();
  61.                     }
  62.                 }
  63.             }
  64.         }
  65.        
  66.         //this has to be done after the avatar part
  67.         e->setRealName(szReal);
  68.     }
  69.  
  70.     KviChannelWindow * chan = msg->connection()->findChannel(szChan);
  71.     if(chan)
  72.     {
  73.         if(!chan->hasWhoList())
  74.         {
  75.             // FIXME: #warning "IF VERBOSE && SHOW INTERNAL WHO REPLIES...."
  76.             return;
  77.         }
  78.         if(chan->sentSyncWhoRequest())
  79.         {
  80.             // FIXME: #warning "IF VERBOSE && SHOW INTERNAL WHO REPLIES...."
  81.             return;
  82.         }
  83.     }
  84.  
  85.     // FIXME: #warning "SYNC OP/VOICE on channel!!!"
  86.  
  87.     if(!msg->haltOutput())
  88.     {
  89.         KviWindow * pOut = chan ? chan : KVI_OPTION_BOOL(KviOption_boolServerRepliesToActiveWindow) ?
  90.             msg->console()->activeWindow() : (KviWindow *)(msg->console());
  91.  
  92.         QString szAway = bAway ? __tr2qs("Yes") : __tr2qs("No");
  93.  
  94.         pOut->output(KVI_OUT_WHO,
  95.             __tr2qs("WHO entry for %c\r!n\r%Q\r%c [%Q@\r!h\r%Q\r]: %cChannel%c: \r!c\r%Q\r, %cServer%c: \r!s\r%Q\r, %cHops%c: %d, %cFlags%c: %Q, %cAway%c: %Q, %cReal name%c: %Q"),
  96.             KviControlCodes::Bold,&szNick, KviControlCodes::Bold,
  97.             &szUser,&szHost,KviControlCodes::Underline,
  98.             KviControlCodes::Underline,&szChan,KviControlCodes::Underline,
  99.             KviControlCodes::Underline,&szServ,KviControlCodes::Underline,
  100.             KviControlCodes::Underline,iHops, KviControlCodes::Underline, KviControlCodes::Underline,
  101.             &szFlag, KviControlCodes::Underline, KviControlCodes::Underline,
  102.             &szAway, KviControlCodes::Underline,
  103.             KviControlCodes::Underline, &szReal);
  104.     }
  105.  
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement