latest version of ArchBlackmann
Modified: trunk/irc/ArchBlackmann/ArchBlackmann.cpp
Modified: trunk/irc/ArchBlackmann/IRCClient.cpp
Modified: trunk/irc/ArchBlackmann/IRCClient.h
Added: trunk/irc/ArchBlackmann/curse.txt
Added: trunk/irc/ArchBlackmann/cursecop.txt
Modified: trunk/irc/ArchBlackmann/dev.txt
Added: trunk/irc/ArchBlackmann/func.txt
Added: trunk/irc/ArchBlackmann/grovel.txt
Added: trunk/irc/ArchBlackmann/irql.txt
Added: trunk/irc/ArchBlackmann/nogrovel.txt
Added: trunk/irc/ArchBlackmann/status.txt
Modified: trunk/irc/ArchBlackmann/tech.txt
Added: trunk/irc/ArchBlackmann/type.txt
_____
Modified: trunk/irc/ArchBlackmann/ArchBlackmann.cpp
--- trunk/irc/ArchBlackmann/ArchBlackmann.cpp 2005-04-20 17:57:26 UTC
(rev 14716)
+++ trunk/irc/ArchBlackmann/ArchBlackmann.cpp 2005-04-20 18:16:32 UTC
(rev 14717)
@@ -9,59 +9,118 @@
#include "File.h"
#include "ssprintf.h"
+#include "trim.h"
#include "IRCClient.h"
using std::string;
using std::vector;
-const char* ArchBlackmann = "ArchBlackmann";
+#if defined(_DEBUG) && 0
+const char* BOTNAME = "RoyBot";
+const char* CHANNEL = "#RoyBotTest";
+#else
+const char* BOTNAME = "ArchBlackmann";
+const char* CHANNEL = "#ReactOS";
+#endif
-vector<string> tech, module, dev, stru, period;
+//vector<string> tech, module, dev, stru, period, status, type, func,
irql, curse, cursecop;
-void ImportList ( vector<string>& list, const char* filename )
+class List
{
- File f ( filename, "r" );
+public:
+ string name;
+ bool macro;
+ std::vector<std::string> list;
+ string tag;
+ int last;
+ List() { last = -1; }
+ List ( const char* _name, bool _macro ) : name(_name),
macro(_macro)
+ {
+ tag = ssprintf("%%%s%%",_name);
+ last = -1;
+ }
+};
+
+vector<List> lists;
+vector<string> ops;
+
+void ImportList ( const char* listname, bool macro )
+{
+ lists.push_back ( List ( listname, macro ) );
+ List& list = lists.back();
+ File f ( ssprintf("%s.txt",listname).c_str(), "r" );
string line;
while ( f.next_line ( line, true ) )
- list.push_back ( line );
+ list.list.push_back ( line );
}
-const char* ListRand ( const vector<string>& list )
+const char* ListRand ( List& list )
{
- return list[rand()%list.size()].c_str();
+ vector<string>& l = list.list;
+ if ( !l.size() )
+ {
+ static string nothing;
+ nothing = ssprintf ( "<list '%s' empty>",
list.name.c_str() );
+ return nothing.c_str();
+ }
+ else if ( l.size() == 1 )
+ return l[0].c_str();
+ int sel = list.last;
+ while ( sel == list.last )
+ sel = rand()%l.size();
+ list.last = sel;
+ return l[sel].c_str();
}
-string TechReply()
+const char* ListRand ( int i )
{
- string t = ListRand(tech);
+ return ListRand ( lists[i] );
+}
+
+int GetListIndex ( const char* listname )
+{
+ for ( int i = 0; i < lists.size(); i++ )
+ {
+ if ( !stricmp ( lists[i].name.c_str(), listname ) )
+ return i;
+ }
+ return -1;
+}
+
+List& GetList ( const char* listname )
+{
+ return lists[GetListIndex(listname)];
+}
+
+const char* ListRand ( const char* list )
+{
+ int i = GetListIndex ( list );
+ if ( i < 0 )
+ return NULL;
+ return ListRand(i);
+}
+
+string TaggedReply ( const char* listname )
+{
+ string t = ListRand(listname);
string out;
const char* p = t.c_str();
while ( *p )
{
if ( *p == '%' )
{
- if ( !strnicmp ( p, "%dev%", 5 ) )
+ bool found = false;
+ for ( int i = 0; i < lists.size() && !found; i++
)
{
- out += ListRand(dev);
- p += 5;
+ if ( lists[i].macro && !strnicmp ( p,
lists[i].tag.c_str(), lists[i].tag.size() ) )
+ {
+ out += ListRand(i);
+ p += lists[i].tag.size();
+ found = true;
+ }
}
- else if ( !strnicmp ( p, "%period%", 8 ) )
- {
- out += ListRand(period);
- p += 8;
- }
- else if ( !strnicmp ( p, "%module%", 8 ) )
- {
- out += ListRand(module);
- p += 8;
- }
- else if ( !strnicmp ( p, "%stru%", 6 ) )
- {
- out += ListRand(stru);
- p += 6;
- }
- else
+ if ( !found )
out += *p++;
}
const char* p2 = strchr ( p, '%' );
@@ -76,6 +135,28 @@
return out;
}
+string gobble ( string& s, const char* delim )
+{
+ const char* p = s.c_str();
+ p += strspn ( p, delim );
+ const char* p2 = strpbrk ( p, delim );
+ if ( !p2 ) p2 = p + strlen(p);
+ string out ( p, p2-p );
+ p2 += strspn ( p2, delim );
+ s = string ( p2 );
+ return out;
+}
+
+bool isop ( const string& who )
+{
+ for ( int i = 0; i < ops.size(); i++ )
+ {
+ if ( ops[i] == who )
+ return true;
+ }
+ return false;
+}
+
// do custom stuff with the IRCClient from your subclass via the
provided callbacks...
class MyIRCClient : public IRCClient
{
@@ -92,8 +173,34 @@
}
bool OnJoin ( const string& user, const string& channel )
{
+ printf ( "user '%s' joined channel '%s'\n",
user.c_str(), channel.c_str() );
return true;
}
+ bool OnPart ( const std::string& user, const std::string&
channel )
+ {
+ for ( int i = 0; i < ops.size(); i++ )
+ {
+ if ( ops[i] == user )
+ {
+ printf ( "remove '%s' to ops list\n",
user.c_str() );
+ ops.erase ( &ops[i] );
+ }
+ }
+ return true;
+ }
+ bool OnNick ( const std::string& oldNick, const std::string&
newNick )
+ {
+ for ( int i = 0; i < ops.size(); i++ )
+ {
+ if ( ops[i] == oldNick )
+ {
+ printf ( "op '%s' changed nick to
'%s'\n", oldNick.c_str(), newNick.c_str() );
+ ops[i] = newNick;
+ return true;
+ }
+ }
+ return true;
+ }
bool OnEndChannelUsers ( const string& channel )
{
return true;
@@ -102,20 +209,169 @@
{
printf ( "<%s> %s\n", from.c_str(), text.c_str() );
flog.printf ( "<%s> %s\n", from.c_str(), text.c_str() );
- return PrivMsg ( from, "hey, your tongue doesn't belong
there!" );
+ if ( strnicmp ( text.c_str(), "!say ", 5 ) ||
!isop(from) )
+ return PrivMsg ( from, "hey, your tongue doesn't
belong there!" );
+ string say = trim(&text[5]);
+ if ( !strnicmp ( say.c_str(), "/me ", 4 ) )
+ return Action ( CHANNEL, trim(&say[4]) );
+ else
+ return PrivMsg ( CHANNEL, trim(say) );
}
bool OnChannelMsg ( const string& channel, const string& from,
const string& text )
{
printf ( "%s <%s> %s\n", channel.c_str(), from.c_str(),
text.c_str() );
flog.printf ( "%s <%s> %s\n", channel.c_str(),
from.c_str(), text.c_str() );
- string text2(text);
+ bool found_name = false;
+ string text2 ( text );
strlwr ( &text2[0] );
- if ( !strnicmp ( text2.c_str(), ArchBlackmann,
strlen(ArchBlackmann) ) )
+
+ if ( !strnicmp ( text.c_str(), BOTNAME, strlen(BOTNAME)
) )
+ found_name = true;
+ else if ( !strnicmp ( text.c_str(), "arch ", 5 ) )
+ found_name = true;
+
+ if ( found_name )
{
- string reply = ssprintf("%s: %s", from.c_str(),
TechReply().c_str());
- flog.printf ( "TECH-REPLY: %s\n", reply.c_str()
);
- return PrivMsg ( channel, reply );
+ string s ( text );
+ gobble ( s, " \t" ); // remove bot name
+ found_name = true;
+ if ( s[0] == '!' )
+ {
+ bool from_op = isop(from);
+ string cmd = gobble ( s, " \t" );
+ if ( !from_op )
+ {
+ if ( cmd == "!grovel" )
+ {
+ string out =
ssprintf(TaggedReply("nogrovel").c_str(),from.c_str());
+ if ( !strnicmp (
out.c_str(), "/me ", 4 ) )
+ return Action (
channel, &out[4] );
+ else
+ return PrivMsg (
channel, out );
+ }
+ return PrivMsg ( channel,
ssprintf("%s: I don't take commands from non-ops",from.c_str()) );
+ }
+ 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] ==
'\'' )
+ {
+ char delim = s[0];
+ const char* p = &s[1];
+ const char* p2 = strchr
( p, delim );
+ if ( !p2 )
+ return PrivMsg (
channel, ssprintf("%s: Couldn't add, unmatched quotes",from.c_str()) );
+ s = string ( p, p2-p );
+ }
+ for ( i = 0; i <
list.list.size(); i++ )
+ {
+ if ( list.list[i] == s )
+ return PrivMsg (
channel, ssprintf("%s: entry already exists in list
'%s'",from.c_str(),listname.c_str()) );
+ }
+ if ( !stricmp (
listname.c_str(), "curse" ) )
+ strlwr ( &s[0] );
+ list.list.push_back ( s );
+ {
+ File f (
ssprintf("%s.txt",list.name.c_str()), "w" );
+ for ( i = 0; i <
list.list.size(); i++ )
+ f.printf (
"%s\n", list.list[i].c_str() );
+ }
+ return PrivMsg ( channel,
ssprintf("%s: entry added to list '%s'",from.c_str(),listname.c_str())
);
+ }
+ else if ( cmd == "!remove" )
+ {
+ 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] ==
'\'' )
+ {
+ char delim = s[0];
+ const char* p = &s[1];
+ const char* p2 = strchr
( p, delim );
+ if ( !p2 )
+ return PrivMsg (
channel, ssprintf("%s: Couldn't add, unmatched quotes",from.c_str()) );
+ s = string ( p, p2-p );
+ }
+ for ( i = 0; i <
list.list.size(); i++ )
+ {
+ if ( list.list[i] == s )
+ {
+ list.list.erase
( &list.list[i] );
+ {
+ File f (
ssprintf("%s.txt",list.name.c_str()), "w" );
+ for ( i
= 0; i < list.list.size(); i++ )
+
f.printf ( "%s\n", list.list[i].c_str() );
+ }
+ return PrivMsg (
channel, ssprintf("%s: entry removed from list
'%s'",from.c_str(),listname.c_str()) );
+ }
+ }
+ return PrivMsg ( channel,
ssprintf("%s: entry doesn't exist in list
'%s'",from.c_str(),listname.c_str()) );
+ }
+ 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
+ {
+ return PrivMsg ( channel,
ssprintf("%s: huh?",from.c_str()) );
+ }
+ }
}
+
+ bool found_curse = false;
+ static vector<string>& curse = GetList("curse").list;
+ text2 = ssprintf(" %s ",text2.c_str());
+ for ( int i = 0; i < curse.size() && !found_curse; i++ )
+ {
+ if ( strstr ( text2.c_str(), curse[i].c_str() )
)
+ found_curse = true;
+ }
+ if ( found_curse )
+ {
+ static List& cursecop = GetList("cursecop");
+ return PrivMsg ( channel, ssprintf("%s: %s",
from.c_str(), ListRand(cursecop)) );
+ }
+ else if ( found_name )
+ {
+ string out = ssprintf("%s: %s", from.c_str(),
TaggedReply("tech").c_str());
+ flog.printf ( "TECH-REPLY: %s\n", out.c_str() );
+ if ( !strnicmp ( out.c_str(), "/me ", 4 ) )
+ return Action ( channel, &out[4] );
+ else
+ return PrivMsg ( channel, out );
+ }
return true;
}
bool OnChannelMode ( const string& channel, const string& mode )
@@ -123,9 +379,45 @@
//printf ( "OnChannelMode(%s,%s)\n", channel.c_str(),
mode.c_str() );
return true;
}
- bool OnUserModeInChannel ( const string& src, const string&
channel, const string& user, const string& mode )
+ bool OnUserModeInChannel ( const string& src, const string&
channel, const string& mode, const string& target )
{
- //printf ( "OnUserModeInChannel(%s,%s%s,%s)\n",
src.c_str(), channel.c_str(), user.c_str(), mode.c_str() );
+ printf ( "OnUserModeInChannel(%s,%s,%s,%s)\n",
src.c_str(), channel.c_str(), mode.c_str(), target.c_str() );
+ const char* p = mode.c_str();
+ if ( !p )
+ return true;
+ while ( *p )
+ {
+ switch ( *p++ )
+ {
+ case '+':
+ while ( *p != 0 && *p != ' ' )
+ {
+ if ( *p == 'o' )
+ {
+ printf ( "adding '%s' to
ops list\n", target.c_str() );
+ ops.push_back ( target
);
+ }
+ break;
+ }
+ break;
+ case '-':
+ while ( *p != 0 && *p != ' ' )
+ {
+ if ( *p == 'o' )
+ {
+ for ( int i = 0; i <
ops.size(); i++ )
+ {
+ if ( ops[i] ==
target )
+ {
+ printf (
"remove '%s' to ops list\n", target.c_str() );
+
ops.erase ( &ops[i] );
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
return true;
}
bool OnMode ( const string& user, const string& mode )
@@ -135,14 +427,16 @@
}
bool OnChannelUsers ( const string& channel, const
vector<string>& users )
{
- printf ( "[%s has %i users]: ", channel.c_str(),
users.size() );
+ //printf ( "[%s has %i users]: ", channel.c_str(),
users.size() );
for ( int i = 0; i < users.size(); i++ )
{
- if ( i )
+ if ( users[i][0] == '@' )
+ ops.push_back ( &users[i][1] );
+ /*if ( i )
printf ( ", " );
- printf ( "%s", users[i].c_str() );
+ printf ( "%s", users[i].c_str() );*/
}
- printf ( "\n" );
+ //printf ( "\n" );
return true;
}
};
@@ -150,32 +444,50 @@
int main ( int argc, char** argv )
{
srand ( time(NULL) );
- ImportList ( tech, "tech.txt" );
- ImportList ( stru, "stru.txt" );
- ImportList ( dev, "dev.txt" );
- ImportList ( period, "period.txt" );
- ImportList ( module, "module.txt" );
+ ImportList ( "dev", true );
+ ImportList ( "func", true );
+ ImportList ( "dev", true );
+ ImportList ( "func", true );
+ ImportList ( "irql", true );
+ ImportList ( "module", true );
+ ImportList ( "period", true );
+ ImportList ( "status", true );
+ ImportList ( "stru", true );
+ ImportList ( "type", true );
+
+ ImportList ( "tech", false );
+ ImportList ( "curse", false );
+ ImportList ( "cursecop", false );
+ ImportList ( "grovel", false );
+ ImportList ( "nogrovel", false );
+
+#ifdef _DEBUG
printf ( "initializing IRCClient debugging\n" );
IRCClient::SetDebug ( true );
+#endif//_DEBUG
printf ( "calling suStartup()\n" );
suStartup();
printf ( "creating IRCClient object\n" );
MyIRCClient irc;
printf ( "connecting to freenode\n" );
- if ( !irc.Connect ( "212.204.214.114" ) ) //
irc.freenode.net
+
+ //const char* server = "212.204.214.114";
+ const char* server = "irc.freenode.net";
+
+ if ( !irc.Connect ( server ) ) //
irc.freenode.net
{
printf ( "couldn't connect to server\n" );
return -1;
}
printf ( "sending user command\n" );
- if ( !irc.User ( "ArchBlackmann", "", "irc.freenode.net",
"Arch
Blackmann" ) )
+ if ( !irc.User ( BOTNAME, "", "irc.freenode.net", BOTNAME ) )
{
printf ( "USER command failed\n" );
return -1;
}
printf ( "sending nick\n" );
- if ( !irc.Nick ( "ArchBlackmann" ) )
+ if ( !irc.Nick ( BOTNAME ) )
{
printf ( "NICK command failed\n" );
return -1;
@@ -186,8 +498,8 @@
printf ( "MODE command failed\n" );
return -1;
}
- printf ( "joining #ReactOS\n" );
- if ( !irc.Join ( "#ReactOS" ) )
+ printf ( "joining channel\n" );
+ if ( !irc.Join ( CHANNEL ) )
{
printf ( "JOIN command failed\n" );
return -1;
_____
Modified: trunk/irc/ArchBlackmann/IRCClient.cpp
--- trunk/irc/ArchBlackmann/IRCClient.cpp 2005-04-20 17:57:26 UTC
(rev 14716)
+++ trunk/irc/ArchBlackmann/IRCClient.cpp 2005-04-20 18:16:32 UTC
(rev 14717)
@@ -81,10 +81,16 @@
bool
IRCClient::PrivMsg ( const string& to, const string& text )
{
- return Send ( "PRIVMSG " + to + " :" + text + "\n" );
+ return Send ( "PRIVMSG " + to + " :" + text + '\n' );
}
bool
+IRCClient::Action ( const string& to, const string& text )
+{
+ return Send ( "PRIVMSG " + to + " :" + (char)1 + "ACTION "
+
text + (char)1 + '\n' );
+}
+
+bool
IRCClient::Part ( const string& channel, const string& text )
{
return Send ( "PART " + channel + " :" + text + "\n" );
@@ -226,10 +232,41 @@
printf ( "!!!:OnRecv failure 5
(PRIVMSG w/o target): %s", buf.c_str() );
continue;
}
- if ( tgt[0] == '#' )
- OnChannelMsg ( tgt, src, text );
+ if ( *p == 1 )
+ {
+ p++;
+ p2 = strchr ( p, ' ' );
+ if ( !p2 ) p2 = p + strlen(p);
+ cmd = string ( p, p2-p );
+ strlwr ( &cmd[0] );
+ p = p2 + 1;
+ p2 = strchr ( p, 1 );
+ if ( !p2 )
+ {
+ printf ( "!!!:OnRecv
failure 6 (no terminating \x01 for initial \x01 found: %s", buf.c_str()
);
+ continue;
+ }
+ text = string ( p, p2-p );
+ if ( cmd == "action" )
+ {
+ if ( tgt[0] == '#' )
+ OnChannelAction
( tgt, src, text );
+ else
+ OnPrivAction (
src, text );
+ }
+ else
+ {
+ printf ( "!!!:OnRecv
failure 7 (unrecognized \x01 command '%s': %s", cmd.c_str(), buf.c_str()
);
+ continue;
+ }
+ }
else
- OnPrivMsg ( src, text );
+ {
+ if ( tgt[0] == '#' )
+ OnChannelMsg ( tgt, src,
text );
+ else
+ OnPrivMsg ( src, text );
+ }
}
else if ( cmd == "mode" )
{
@@ -237,22 +274,22 @@
//printf ( "[MODE] src='%s' cmd='%s'
tgt='%s' text='%s'", src.c_str(), cmd.c_str(), tgt.c_str(),
text.c_str()
);
//OnMode (
// self mode change:
- // [MODE] src=Relic3_14 cmd=mode
tgt=Relic3_14 text=+i
+ // [MODE] src=Nick cmd=mode tgt=Nick
text=+i
// channel mode change:
- // [MODE] src=Royce3 cmd=mode
tgt=#Royce3 text=+o Relic3_14
+ // [MODE] src=Nick cmd=mode tgt=#Channel
text=+o Nick
if ( tgt[0] == '#' )
{
p = text.c_str();
p2 = strchr ( p, ' ' );
- if ( !p2 )
- OnChannelMode ( tgt,
text );
- else
+ if ( p2 && *p2 )
{
- string user ( p, p2-p );
+ string mode ( p, p2-p );
p = p2 + 1;
p += strspn ( p, " " );
- OnUserModeInChannel (
src, tgt, user, p );
+ OnUserModeInChannel (
src, tgt, mode, trim(p) );
}
+ else
+ OnChannelMode ( tgt,
text );
}
else
OnMode ( tgt, text );
@@ -261,6 +298,14 @@
{
OnJoin ( src, text );
}
+ else if ( cmd == "part" )
+ {
+ OnPart ( src, text );
+ }
+ else if ( cmd == "nick" )
+ {
+ OnNick ( src, text );
+ }
else if ( isdigit(cmd[0]) )
{
int i = atoi(cmd.c_str());
@@ -307,7 +352,13 @@
}
else
{
- if ( _debug ) printf ( "unrecognized ':'
response: %s", buf.c_str() );
+ if ( strstr ( buf.c_str(), "ACTION" ) )
+ {
+ printf ( "ACTION: " );
+ for ( int i = 0; i < buf.size();
i++ )
+ printf ( "%c(%xh)",
buf[i], (unsigned)(unsigned char)buf[i] );
+ }
+ else if ( _debug ) printf (
"unrecognized ':' response: %s", buf.c_str() );
}
}
else
_____
Modified: trunk/irc/ArchBlackmann/IRCClient.h
--- trunk/irc/ArchBlackmann/IRCClient.h 2005-04-20 17:57:26 UTC (rev
14716)
+++ trunk/irc/ArchBlackmann/IRCClient.h 2005-04-20 18:16:32 UTC (rev
14717)
@@ -48,6 +48,9 @@
// send message to someone or some channel
bool PrivMsg ( const std::string& to, const std::string& text );
+ // send /me to someone or some channel
+ bool Action ( const std::string& to, const std::string& text );
+
// leave a channel
bool Part ( const std::string& channel, const std::string& text
);
@@ -59,32 +62,45 @@
// OnConnected: you just successfully logged into irc server
virtual bool OnConnected() = 0;
- // OnJoin: you just successfully joined this channel
- virtual bool OnJoin ( const std::string& user, const
std::string& channel ) = 0;
+ virtual bool OnNick ( const std::string& oldNick, const
std::string& newNick ) { return true; }
+ // OnJoin: someone just successfully joined a channel you are in
( also sent when you successfully join a channel )
+ virtual bool OnJoin ( const std::string& user, const
std::string& channel ) { return true; }
+
+ // OnPart: someone just left a channel you are in
+ virtual bool OnPart ( const std::string& user, const
std::string& channel ) { return true; }
+
// OnPrivMsg: you just received a private message from a user
- virtual bool OnPrivMsg ( const std::string& from, const
std::string& text ) = 0;
+ virtual bool OnPrivMsg ( const std::string& from, const
std::string& text ) { return true; }
+ virtual bool OnPrivAction ( const std::string& from, const
std::string& text ) { return true; }
+
// OnChannelMsg: you just received a chat line in a channel
virtual bool OnChannelMsg ( const std::string& channel, const
std::string& from,
- const std::string& text ) = 0;
+ const std::string& text ) { return true; }
+ // OnChannelAction: you just received a "/me" line in a channel
+ virtual bool OnChannelAction ( const std::string& channel, const
std::string& from,
+ const std::string& text ) { return true; }
+
// OnChannelMode: notification of a change of a channel's mode
- virtual bool OnChannelMode ( const std::string& channel, const
std::string& mode ) = 0;
+ virtual bool OnChannelMode ( const std::string& channel, const
std::string& mode )
+ { return true; }
// OnUserModeInChannel: notification of a mode change of a user
with respect to a channel.
// f.ex.: this will be called when someone is oped in a channel.
virtual bool OnUserModeInChannel ( const std::string& src, const
std::string& channel,
- const std::string& user, const std::string& mode ) = 0;
+ const std::string& mode, const std::string& target ) {
return true; }
// OnMode: you will receive this when you change your own mode,
at least...
- virtual bool OnMode ( const std::string& user, const
std::string& mode ) = 0;
+ virtual bool OnMode ( const std::string& user, const
std::string& mode ) { return true; }
// notification of what users are in a channel ( you may get
multiple of these... )
- virtual bool OnChannelUsers ( const std::string& channel, const
std::vector<std::string>& users ) = 0;
+ virtual bool OnChannelUsers ( const std::string& channel, const
std::vector<std::string>& users )
+ { return true; }
// notification that you have received the entire list of users
for a channel
- virtual bool OnEndChannelUsers ( const std::string& channel ) =
0;
+ virtual bool OnEndChannelUsers ( const std::string& channel ) {
return true; }
// OnPing - default implementation replies to PING with a valid
PONG. required on some systems to
// log in. Most systems require a response in order to stay
connected, used to verify a client hasn't
_____
Added: trunk/irc/ArchBlackmann/curse.txt
--- trunk/irc/ArchBlackmann/curse.txt 2005-04-20 17:57:26 UTC (rev
14716)
+++ trunk/irc/ArchBlackmann/curse.txt 2005-04-20 18:16:32 UTC (rev
14717)
@@ -0,0 +1,26 @@
+shit
+fuck
+pussy
+ ass
+ ass-
+-ass
+dumbass
+jackass
+fatass
+asshole
+smartass
+cunt
+fucker
+bitch
+dick
+penile
+stfu
+omfg
+lmao
+ ass.
+-ass.
+semprini
+goat.cx
+ekush
+akshor
+poop
Property changes on: trunk/irc/ArchBlackmann/curse.txt
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Added: trunk/irc/ArchBlackmann/cursecop.txt
--- trunk/irc/ArchBlackmann/cursecop.txt 2005-04-20 17:57:26 UTC
(rev 14716)
+++ trunk/irc/ArchBlackmann/cursecop.txt 2005-04-20 18:16:32 UTC
(rev 14717)
@@ -0,0 +1,10 @@
+You should have your mouth washed out with soap!
+This is a clean channel... please watch your language
+Please try to keep it clean
+Hey, there's children present ( I'm not even a year old yet! )
+Could you find a less-offensive way to express yourself, please?
+Such language :(
+Those aren't nice words to use
+Oh, my poor innocent ears :(
+Help! My mind is being corrupted!
+filthy mouths are not appreciated here
Property changes on: trunk/irc/ArchBlackmann/cursecop.txt
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Modified: trunk/irc/ArchBlackmann/dev.txt
--- trunk/irc/ArchBlackmann/dev.txt 2005-04-20 17:57:26 UTC (rev
14716)
+++ trunk/irc/ArchBlackmann/dev.txt 2005-04-20 18:16:32 UTC (rev
14717)
@@ -11,4 +11,5 @@
blight_
jimtabor
mtempel
-Gge
\ No newline at end of file
+Gge
+Alex_Ionescu
_____
Added: trunk/irc/ArchBlackmann/func.txt
--- trunk/irc/ArchBlackmann/func.txt 2005-04-20 17:57:26 UTC (rev
14716)
+++ trunk/irc/ArchBlackmann/func.txt 2005-04-20 18:16:32 UTC (rev
14717)
@@ -0,0 +1,581 @@
+BOOLEAN
+CcCanIWrite
+CcCopyRead
+CcCopyWrite
+CcDeferWrite
+CcFastCopyRead
+CcFastCopyWrite
+CcFlushCache
+CcGetDirtyPages
+CcGetFileObjectFromBcb
+CcGetFileObjectFromSectionPtrs
+CcGetFlushedValidData
+CcGetLsnForFileObject
+CcInitializeCacheMap
+CcIsThereDirtyData
+CcMapData
+CcMdlRead
+CcMdlReadComplete
+CcMdlWriteAbort
+CcMdlWriteComplete
+CcPinMappedData
+CcPinRead
+CcPrepareMdlWrite
+CcPreparePinWrite
+CcPurgeCacheSection
+CcRemapBcb
+CcRepinBcb
+CcScheduleReadAhead
+CcSetAdditionalCacheAttributes
+CcSetBcbOwnerPointer
+CcSetDirtyPageThreshold
+CcSetDirtyPinnedData
+CcSetFileSizes
+CcSetLogHandleForFile
+CcSetReadAheadGranularity
+CcUninitializeCacheMap
+CcUnpinData
+CcUnpinDataForThread
+CcUnpinRepinnedBcb
+CcWaitForCurrentLazyWriterActivity
+CcZeroData
+DbgLoadImageSymbols
+DbgQueryDebugFilterState
+DbgSetDebugFilterState
+EVENT_TYPE
+ExAcquireResourceExclusive
+ExAcquireResourceExclusiveLite
+ExAcquireResourceSharedLite
+ExAcquireSharedStarveExclusive
+ExAcquireSharedWaitForExclusive
+ExAllocateFromZone
+ExAllocatePool
+ExAllocatePoolWithQuota
+ExAllocatePoolWithQuotaTag
+ExAllocatePoolWithTag
+ExConvertExclusiveToSharedLite
+ExCreateCallback
+ExDeleteNPagedLookasideList
+ExDeletePagedLookasideList
+ExDeleteResource
+ExDeleteResourceLite
+ExDisableResourceBoostLite
+ExEnumHandleTable
+ExExtendZone
+ExFreePool
+ExGetCurrentProcessorCounts
+ExGetCurrentProcessorCpuUsage
+ExGetExclusiveWaiterCount
+ExGetPreviousMode
+ExGetSharedWaiterCount
+ExInitializeNPagedLookasideList
+ExInitializePagedLookasideList
+ExInitializeResource
+ExInitializeResourceLite
+ExInitializeZone
+ExInterlockedAddLargeInteger
+ExInterlockedAddUlong
+ExInterlockedDecrementLong
+ExInterlockedExchangeUlong
+ExInterlockedExtendZone
+ExInterlockedIncrementLong
+ExInterlockedInsertHeadList
+ExInterlockedInsertTailList
+ExInterlockedPopEntryList
+ExInterlockedPushEntryList
+ExInterlockedRemoveHeadList
+ExIsProcessorFeaturePresent
+ExIsResourceAcquiredExclusiveLite
+ExIsResourceAcquiredSharedLite
+ExLocalTimeToSystemTime
+ExNotifyCallback
+ExPostSystemEvent
+ExQueryPoolBlockSize
+ExQueueWorkItem
+ExRaiseAccessViolation
+ExRaiseDatatypeMisalignment
+ExRaiseException
+ExRaiseHardError
+ExRaiseStatus
+ExRegisterCallback
+ExReinitializeResourceLite
+ExReleaseResource
+ExReleaseResourceForThread
+ExReleaseResourceForThreadLite
+ExRosDumpPagedPoolByTag
+ExRosQueryPoolTag
+ExSetResourceOwnerPointer
+ExSetTimerResolution
+ExSystemExceptionFilter
+ExSystemTimeToLocalTime
+ExTryToAcquireResourceExclusiveLite
+ExUnregisterCallback
+ExUuidCreate
+ExVerifySuite
+FsRtlAcquireFileExclusive
+FsRtlAddMcbEntry
+FsRtlAddToTunnelCache
+FsRtlAllocateFileLock
+FsRtlAllocatePool
+FsRtlAllocatePoolWithQuota
+FsRtlAllocatePoolWithQuotaTag
+FsRtlAllocatePoolWithTag
+FsRtlAllocateResource
+FsRtlAreNamesEqual
+FsRtlBalanceReads
+FsRtlCheckLockForReadAccess
+FsRtlCheckLockForWriteAccess
+FsRtlCopyRead
+FsRtlCopyWrite
+FsRtlFastCheckLockForRead
+FsRtlFastCheckLockForWrite
+FsRtlFastUnlockAll
+FsRtlFastUnlockAllByKey
+FsRtlFastUnlockSingle
+FsRtlFindInTunnelCache
+FsRtlFreeFileLock
+FsRtlGetFileSize
+FsRtlGetNextFileLock
+FsRtlGetNextMcbEntry
+FsRtlIncrementCcFastReadNoWait
+FsRtlIncrementCcFastReadNotPossible
+FsRtlIncrementCcFastReadResourceMiss
+FsRtlIncrementCcFastReadWait
+FsRtlInitializeFileLock
+FsRtlInitializeMcb
+FsRtlInitializeTunnelCache
+FsRtlInsertPerFileObjectContext
+FsRtlInsertPerStreamContext
+FsRtlIsDbcsInExpression
+FsRtlIsFatDbcsLegal
+FsRtlIsHpfsDbcsLegal
+FsRtlIsNameInExpression
+FsRtlLookupLastLargeMcbEntryAndIndex
+FsRtlLookupLastMcbEntry
+FsRtlLookupMcbEntry
+FsRtlLookupPerFileObjectContext
+FsRtlLookupPerStreamContextInternal
+FsRtlMdlRead
+FsRtlMdlReadComplete
+FsRtlMdlReadCompleteDev
+FsRtlMdlReadDev
+FsRtlMdlWriteComplete
+FsRtlMdlWriteCompleteDev
+FsRtlNotifyChangeDirectory
+FsRtlNotifyCleanup
+FsRtlNotifyFilterChangeDirectory
+FsRtlNotifyFilterReportChange
+FsRtlNotifyFullChangeDirectory
+FsRtlNotifyFullReportChange
+FsRtlNotifyReportChange
+FsRtlNotifyUninitializeSync
+FsRtlNumberOfRunsInMcb
+FsRtlPostPagingFileStackOverflow
+FsRtlPostStackOverflow
+FsRtlPrepareMdlWrite
+FsRtlPrepareMdlWriteDev
+FsRtlPrivateLock
+FsRtlProcessFileLock
+FsRtlRegisterFileSystemFilterCallbacks
+FsRtlReleaseFile
+FsRtlRemoveMcbEntry
+FsRtlRemovePerFileObjectContext
+FsRtlRemovePerStreamContext
+FsRtlResetLargeMcb
+FsRtlSyncVolumes
+FsRtlTeardownPerStreamContexts
+FsRtlTruncateMcb
+FsRtlUninitializeFileLock
+FsRtlUninitializeMcb
+HalAdjustResourceList
+HalAllocateCommonBuffer
+HalAssignSlotResources
+HalCalibratePerformanceCounter
+HalFlushCommonBuffer
+HalFreeCommonBuffer
+HalGetAdapter
+HalGetBusData
+HalGetBusDataByOffset
+HalGetDmaAlignmentRequirement
+HalMakeBeep
+HalQueryDisplayParameters
+HalQueryRealTimeClock
+HalReadDmaCounter
[truncated at 1000 lines; 2154 more skipped]