+ }
+
+ // from op
+ else if ( cmd == "!grovel" )
+ {
+ string out = ssprintf(TaggedReply("grovel").c_str(),from.c_str());
+ if ( !strnicmp ( out.c_str(), "/me ", 4 ) )
+ return Action ( channel, &out[4] );
+ else
+ return PrivMsg ( channel, out );
+ }
+ else if ( cmd == "!kiss" )
+ {
+ if ( s.size() )
+ return Action ( channel, ssprintf("kisses %s",s.c_str()) );
+ else
+ return PrivMsg ( channel, ssprintf("%s: huh?",from.c_str()) );
+ }
+ else if ( cmd == "!hug" )
+ {
+ if ( s.size() )
+ return Action ( channel, ssprintf("hugs %s",s.c_str()) );
+ else
+ return PrivMsg ( channel, ssprintf("%s: huh?",from.c_str()) );
+ }
+ else if ( cmd == "!give" )
+ {
+ string who = gobble(s," \t");
+ if ( who.size() && s.size() )
+ return Action ( channel, ssprintf("gives %s a %s",who.c_str(),s.c_str()) );
+ else
+ return PrivMsg ( channel, ssprintf("%s: huh?",from.c_str()) );
+ }
+ else if ( cmd == "!what" )
+ {
+ PrivMsg ( channel, "For ops I support the following commands:" );
+ PrivMsg ( channel, "!grovel" );
+ PrivMsg ( channel, "!kiss" );
+ PrivMsg ( channel, "!hug" );
+ PrivMsg ( channel, "!give" );
+ PrivMsg ( channel, "!say (the input is a private message)" );
+ PrivMsg ( channel, "!add" );
+ PrivMsg ( channel, "!remove" );
+ PrivMsg ( channel, " - for more info see wiki" );
+ }
+ else if ( cmd == "!add" )
+ {
+ string listname = gobble ( s, " \t" );
+ int i = GetListIndex ( listname.c_str() );
+ if ( i == -1 )
+ return PrivMsg ( channel, ssprintf("%s: I don't have a list named '%s'",from.c_str(),listname.c_str()) );
+ List& list = lists[i];
+ if ( s[0] == '\"' || s[0] == '\'' )