Changeset 286:f89643c5ff59

Show
Ignore:
Timestamp:
06/22/2008 06:53:57 PM (4 years ago)
Author:
Dmitry Nezhevenko <dion@…>
Branch:
default
Message:

ALists: version matchers

Location:
src/plugins/muc
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • src/plugins/muc/alistitem.cpp

    r283 r286  
    6464        { 
    6565        case AListItem::MatcherUnknown: 
    66                 flags+="?"; 
     66                flags+="? "; 
    6767                break; 
    6868        case AListItem::MatcherNick: 
    69                 flags+="N"; 
     69                flags+="N "; 
    7070                break; 
    7171        case AListItem::MatcherJid: 
    72                 flags+="J"; 
     72                flags+="J "; 
    7373                break; 
    7474        case AListItem::MatcherBody: 
    75                 flags+="B"; 
     75                flags+="B "; 
    7676                break; 
    7777        case AListItem::MatcherResource: 
    78                 flags+="R"; 
     78                flags+="R "; 
     79                break; 
     80        case AListItem::MatcherVersion: 
     81                flags+="V "; 
     82                break; 
     83        case AListItem::MatcherVersionName: 
     84                flags+="Vn"; 
     85                break; 
     86        case AListItem::MatcherVersionClient: 
     87                flags+="Vn"; 
     88                break; 
     89        case AListItem::MatcherVersionOs: 
     90                flags+="Vo"; 
    7991                break; 
    8092        }; 
  • src/plugins/muc/alistitem.h

    r283 r286  
    2929        enum MatcherType 
    3030        { 
     31                MatcherAll=-1, 
    3132                MatcherUnknown=0, 
    3233                MatcherNick=1, 
    3334                MatcherJid=2, 
    3435                MatcherBody=3, 
    35                 MatcherResource=4 
     36                MatcherResource=4, 
     37                MatcherVersion=5, 
     38                MatcherVersionName=6, 
     39                MatcherVersionClient=7, 
     40                MatcherVersionOs=8 
    3641        }; 
    3742         
     
    4146                TestExact=1, 
    4247                TestRegExp=2, 
    43                 TestSubstring=3          
     48                TestSubstring=3 
    4449        }; 
    4550         
  • src/plugins/muc/mucplugin.cpp

    r285 r286  
    993993        delete req; 
    994994        bot()->asyncRequests()->removeAll(req); 
     995        nick->setVersionStored(true); 
     996        checkMember(0L, conf, nick, AListItem::MatcherVersion); 
    995997        return true; 
    996998} 
     
    10331035 
    10341036                AListItem* item=0; 
    1035                 if (item=aFind(conf->aban(), n, 0L)) 
     1037                if (item=aFind(conf->aban(), n, 0L, AListItem::MatcherAll)) 
    10361038                        answer+=QString("\"%1\" is in aban list: %2\n").arg(arg2.toLower()).arg(item->toString()); 
    1037                 if (item=aFind(conf->akick(), n, 0L)) 
     1039                if (item=aFind(conf->akick(), n, 0L, AListItem::MatcherAll)) 
    10381040                        answer+=QString("\"%1\" is in akick list: %2\n").arg(arg2.toLower()).arg(item->toString()); 
    1039                 if (item=aFind(conf->avisitor(), n, 0L)) 
     1041                if (item=aFind(conf->avisitor(), n, 0L, AListItem::MatcherAll)) 
    10401042                        answer+=QString("\"%1\" is in avisitor list: %2\n").arg(arg2.toLower()).arg(item->toString()); 
    1041                 if (item=aFind(conf->amoderator(), n, 0L)) 
     1043                if (item=aFind(conf->amoderator(), n, 0L, AListItem::MatcherAll)) 
    10421044                        answer+=QString("\"%1\" is in amoderator list: %2\n").arg(arg2.toLower()).arg(item->toString()); 
    1043                 if (item=aFind(conf->acommand(), n, 0L)) 
     1045                if (item=aFind(conf->acommand(), n, 0L, AListItem::MatcherAll)) 
    10441046                        answer+=QString("\"%1\" is in acmd list: %2\n").arg(arg2.toLower()).arg(item->toString()); 
    10451047                if (answer.endsWith("\n")) 
     
    11671169        qDebug() << "1: " << arg2; 
    11681170         
    1169         if (arg2=="NICK" || arg2=="BODY" || arg2=="RES") 
     1171        if (arg2=="NICK" || arg2=="BODY" || arg2=="RES"  
     1172                || arg2=="VERSION" || arg2=="VERSION.NAME"  
     1173                || arg2=="VERSION.CLIENT" || arg2=="VERSION.OS") 
    11701174        { 
    11711175                if (arg2=="NICK") 
     
    11751179                else if (arg2=="RES") 
    11761180                        item.setMatcherType(AListItem::MatcherResource); 
     1181                else if (arg2=="VERSION") 
     1182                        item.setMatcherType(AListItem::MatcherVersion); 
     1183                else if (arg2=="VERSION.NAME") 
     1184                        item.setMatcherType(AListItem::MatcherVersionName); 
     1185                else if (arg2=="VERSION.CLIENT") 
     1186                        item.setMatcherType(AListItem::MatcherVersionClient); 
     1187                else if (arg2=="VERSION.OS") 
     1188                        item.setMatcherType(AListItem::MatcherVersionOs); 
    11771189 
    11781190                arg2=parser.nextToken().toUpper(); 
     
    12751287 
    12761288// Stanza can be null here 
    1277 AListItem* MucPlugin::aFind(AList* list, Nick* nick, gloox::Stanza* s) 
     1289AListItem* MucPlugin::aFind(AList* list, Nick* nick, gloox::Stanza* s, AListItem::MatcherType matcher) 
    12781290{ 
    12791291        int cnt=list->count(); 
     
    12851297        if (s) 
    12861298                lBody=QString::fromStdString(s->body()).toLower(); 
     1299        QString version; 
     1300        if (nick->isVersionStored()) 
     1301                version=nick->versionName()+" "+nick->versionClient()+" // "+nick->versionOs(); 
    12871302         
    12881303        bool isPresence=!s || (s->type()==gloox::StanzaPresence); 
     
    12911306        { 
    12921307                AListItem* item=list->at(i); 
     1308                 
     1309                if (matcher!=AListItem::MatcherUnknown && matcher!=AListItem::MatcherAll &&  
     1310                                !item->matcherType()!=matcher) 
     1311                { 
     1312                        if (matcher=AListItem::MatcherVersion) 
     1313                        { 
     1314                                if (!(item->matcherType()==AListItem::MatcherVersionName 
     1315                                                                || item->matcherType()==AListItem::MatcherVersionClient 
     1316                                                                || item->matcherType()==AListItem::MatcherVersionOs)) 
     1317                                        continue; 
     1318                        } 
     1319                        else 
     1320                                continue; 
     1321                } 
    12931322         
    12941323                QString testValue; 
     
    12971326                        continue; 
    12981327                 
     1328                if (item->matcherType() == AListItem::MatcherVersion  
     1329                        || item->matcherType()==AListItem::MatcherVersionName 
     1330                        || item->matcherType()==AListItem::MatcherVersionClient 
     1331                        || item->matcherType()==AListItem::MatcherVersionOs) 
     1332                { 
     1333                        if (matcher!=AListItem::MatcherVersion && matcher!=AListItem::MatcherAll) 
     1334                                continue; 
     1335                        if (!nick || !nick->isVersionStored()) 
     1336                                continue; 
     1337                } 
     1338                 
    12991339                switch (item->matcherType()) 
    13001340                { 
     
    13041344                        case AListItem::MatcherResource: testValue=lResource; break; 
    13051345                        case AListItem::MatcherBody: testValue=lBody; break; 
    1306                 } 
     1346                        case AListItem::MatcherVersion: testValue=version; break; 
     1347                        case AListItem::MatcherVersionName: testValue=nick->versionName(); break; 
     1348                        case AListItem::MatcherVersionClient: testValue=nick->versionClient(); break; 
     1349                        case AListItem::MatcherVersionOs: testValue=nick->versionOs(); break; 
     1350                        default: continue; 
     1351                } 
     1352                 
    13071353                if (testValue.isEmpty()) 
    13081354                        continue; 
     
    13281374                        case AListItem::TestSubstring: 
    13291375                        { 
    1330                                 if (item->isInvert() ^ (testValue.indexOf(item->value())>=0)) 
     1376                                if (item->isInvert() ^ (testValue.toLower().indexOf(item->value().toLower())>=0)) 
    13311377                                        return item; 
    13321378                                break; 
     
    13371383} 
    13381384 
    1339 void MucPlugin::checkMember(gloox::Stanza* s, Conference*c, Nick* n) 
     1385void MucPlugin::checkMember(gloox::Stanza* s, Conference*c, Nick* n, AListItem::MatcherType matcher) 
    13401386{ 
    13411387        if (!n || !c) 
     
    13541400        if (((aff!="OWNER") && !aff.startsWith("ADMIN") && aff!="MEMBER")|| c->configurator()->isApplyAlistsToMembers()) 
    13551401        { 
    1356                 if (item=aFind(c->aban(), n, s)) 
     1402                if (item=aFind(c->aban(), n, s, matcher)) 
    13571403                { 
    13581404                        if (s && warnImOwner(s)) 
     
    13651411                } 
    13661412 
    1367                 if (item=aFind(c->akick(), n, s)) 
     1413                if (item=aFind(c->akick(), n, s, matcher)) 
    13681414                { 
    13691415                        QString reason=item->reason(); 
     
    13731419                        return; 
    13741420                } 
    1375                 if (item=aFind(c->avisitor(), n, s)) 
     1421                if (item=aFind(c->avisitor(), n, s, matcher)) 
    13761422                { 
    13771423                        QString reason=item->reason(); 
     
    13821428                } 
    13831429        } 
    1384         if (item=aFind(c->amoderator(), n, s)) 
     1430        if (item=aFind(c->amoderator(), n, s, matcher)) 
    13851431        { 
    13861432                QString reason=item->reason(); 
     
    13911437        } 
    13921438         
    1393         if (item=aFind(c->acommand(), n, s)) 
     1439        if (item=aFind(c->acommand(), n, s, matcher)) 
    13941440        { 
    13951441                QString action=item->reason(); 
  • src/plugins/muc/mucplugin.h

    r285 r286  
    44#include "base/baseplugin.h" 
    55#include "conferencelist.h" 
     6#include "alistitem.h" 
    67 
    78class MessageParser; 
     
    5455        void setAffiliation(Conference* conf, const QString& jid, const QString& affiliation, const QString& reason=QString::null); 
    5556        QString getIqError(gloox::Stanza* s); 
    56         AListItem* aFind(AList* list, Nick *n, gloox::Stanza* s); 
     57        AListItem* aFind(AList* list, Nick *n, gloox::Stanza* s, AListItem::MatcherType matcher=AListItem::MatcherUnknown); 
    5758        // Advanced commands 
    5859        bool autoLists(gloox::Stanza* s, MessageParser& parser); 
    59         void checkMember(gloox::Stanza* s, Conference* c, Nick*); 
     60        void checkMember(gloox::Stanza* s, Conference* c, Nick*, AListItem::MatcherType matcher=AListItem::MatcherUnknown); 
    6061        void recheckJIDs(Conference* c); 
    6162        void sendMessage(Conference* conf, const QString&msg); 
  • src/plugins/muc/nick.cpp

    r271 r286  
    1818        myLazyLeave=false; 
    1919        myJoined=QDateTime::currentDateTime(); 
     20        versionStored_=false; 
    2021        qDebug() << "[NICK] created: " << myNick; 
    2122 
     
    8384        myId=id; 
    8485        myValidateRequired=false; 
    85                  
     86        versionStored_=false; 
    8687         
    8788        QSqlQuery query=DataStorage::instance() 
  • src/plugins/muc/nick.h

    r284 r286  
    2525        Jid* jid() const { return myJid; }; 
    2626        bool validateRequired() const { return myValidateRequired; }; 
     27        bool isVersionStored() const { return versionStored_; } 
    2728        QString versionName() const { return versionName_; } 
    2829        QString versionOs() const { return versionOs_; } 
     
    4344        static void setAllOffline (Conference* conf); 
    4445        bool isDevoicedNoVCard() const {return devoicedNoVCard_; } 
     46        bool setVersionStored(bool v) { versionStored_=v; } 
    4547        void setDevoicedNoVCard(bool v) { devoicedNoVCard_ = v; } 
    4648        void setVersionName(const QString& name) { versionName_=name; }; 
     
    6365        QString myStatus; 
    6466        bool devoicedNoVCard_; 
     67        bool versionStored_; 
    6568        QString versionName_; 
    6669        QString versionOs_;