--- /dev/null
+Hybrid ircd support, this "works for me" on a private testnet.
+This probably should not be committed, merely kept in a "contrib"
+directory.
+
+Index: gameserv.cpp
+===================================================================
+RCS file: /cvsroot/gameservirc/gameserv/gameserv.cpp,v
+retrieving revision 1.14
+diff -u -r1.14 gameserv.cpp
+--- gameserv.cpp 24 Oct 2003 16:04:51 -0000 1.14
++++ gameserv.cpp 26 Oct 2003 22:41:46 -0000
+@@ -116,7 +119,7 @@
+ timestamp = strtok(NULL, "\1");
+ notice(s_GameServ, source, "\1PING %s\1", timestamp);
+ } else if (stricmp(cmd, ":\1VERSION\1") == 0) {
+- notice(s_GameServ, source, "\1VERSION GameServ v1.0b\1");
++ notice(s_GameServ, source, "\1VERSION GameServ v1.0b+hybrid_0.1\1");
+ } else if (stricmp(cmd, "SEARCH") == 0) {
+ cmd = strtok(NULL, " ");
+
+Index: tcpclient.cpp
+===================================================================
+RCS file: /cvsroot/gameservirc/gameserv/tcpclient.cpp,v
+retrieving revision 1.6
+diff -u -r1.6 tcpclient.cpp
+--- tcpclient.cpp 23 Oct 2003 21:27:19 -0000 1.6
++++ tcpclient.cpp 26 Oct 2003 22:41:46 -0000
+@@ -56,14 +56,11 @@
+ return -1;
+ }
+
+- raw("PROTOCTL NICKv2 VHP");
+- raw("PASS :%s", remotepass);
++ raw("PASS %s :TS", remotepass);
+ raw("SERVER %s 1 :Testing Server", servername);
+- raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :GameServ", time(NULL), gshost,
+- servername, time(NULL), gshost);
+- raw(":%S JOIN %s", c_Forest);
+- raw(":%S MODE %s +o %S", c_Forest);
+- raw(":%S MODE %s +ntm", c_Forest);
++ raw("NICK %S %ld 1 +o %S %s %s :GameServ", time(NULL), gshost,
++ servername);
++ raw(":%s SJOIN 1 %s +ntm :@%S", servername, c_Forest);
+
+ sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to
+ David Duchene <dave@ltd.com> for pointing out the possible
+@@ -128,11 +125,28 @@
+ gameserv(source, rest);
+ else if (stricmp(dest, c_Forest) == 0)
+ forest(source, rest);
+- } else if (stricmp(cmd, "JOIN") == 0) {
++ } else if (stricmp(cmd, "SJOIN") == 0) {
+ char *channel;
+- channel = strtok(NULL, " ");
+- if (stricmp(channel, c_Forest) == 0 && is_playing(source + 1))
+- raw(":%S MODE %s +v %s", c_Forest, (source + 1));
++ char *userptr;
++ char *tmp;
++ channel = strtok(NULL, " "); // channel timestamp
++ channel = strtok(NULL, " "); // channel name
++ tmp = strrchr(buffer, ':');
++ tmp++;
++ userptr = strtok(tmp, " ");
++ while (userptr != NULL)
++ {
++ if (*userptr == '@')
++ userptr++;
++ if (*userptr == '+')
++ userptr++; // Assume that for users opped and voiced
++ // that they are never passed as +@user
++
++ if (stricmp(channel, c_Forest) == 0 && is_playing(userptr))
++ raw(":%S MODE %s +v %s", c_Forest, userptr);
++
++ userptr = strtok(NULL, " ");
++ }
+ } else {
+ // cout << "Unrecognized Message: cmd = " << cmd << setw(30) << "source = " <<
+ // source << endl;