Author Topic: Gaim Plugin Request  (Read 17473 times)

0 Members and 1 Guest are viewing this topic.

Offline Towelie

  • pwnstar
  • x86
  • Hero Member
  • *****
  • Posts: 4873
    • View Profile
Gaim Plugin Request
« on: September 18, 2005, 03:42:48 pm »
I was wondering if anyone could write a plugin for me that displays what song im playing in Winamp, if you are interested aim me so I could give you details
Edit
My aim is Towelie4365

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #1 on: September 18, 2005, 04:00:14 pm »
You know, I saw this and I thought "Well, seeing as how we're requesting Gaim plugins, I'll request a Winamp plugin!".

I'd like it too! =)
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Sidoh

  • x86
  • Hero Member
  • *****
  • Posts: 17634
  • MHNATY ~~~~~
    • View Profile
    • sidoh
Re: Gaim Plugin Request
« Reply #2 on: September 18, 2005, 04:04:30 pm »
I thought there already was one?  Maybe I'm mistaken.

Offline Quik

  • Webmaster Guy
  • x86
  • Hero Member
  • *****
  • Posts: 3262
  • \x51 \x75 \x69 \x6B \x5B \x78 \x38 \x36 \x5D
    • View Profile
Re: Gaim Plugin Request
« Reply #3 on: September 18, 2005, 04:05:43 pm »
Yoni wrote a pretty nice plugin for Trillian Pro located here: http://yoni.valhallalegends.com/yplugin2.asp

It wouldn't be that hard for you to make it Gaim compatable.
Quote
[20:21:13] xar: i was just thinking about the time iago came over here and we made this huge bomb and light up the sky for 6 min
[20:21:15] xar: that was funny

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #4 on: September 18, 2005, 04:09:44 pm »
I thought there already was one?  Maybe I'm mistaken.

I've spent hours searching for one, and never found more than a simple request.

@Quik: Yup, used that when I had trillian.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Sidoh

  • x86
  • Hero Member
  • *****
  • Posts: 17634
  • MHNATY ~~~~~
    • View Profile
    • sidoh
Re: Gaim Plugin Request
« Reply #5 on: September 18, 2005, 04:21:33 pm »
I've spent hours searching for one, and never found more than a simple request.

@Quik: Yup, used that when I had trillian.

Huh, that's weird.  Oh well.  :p

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #6 on: September 18, 2005, 04:25:55 pm »
The majority of Gaim users with skill in C++ programming are Linux users. Theres about 20 xMMs plugins out there.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Sidoh

  • x86
  • Hero Member
  • *****
  • Posts: 17634
  • MHNATY ~~~~~
    • View Profile
    • sidoh
Re: Gaim Plugin Request
« Reply #7 on: September 18, 2005, 04:27:46 pm »
The majority of Gaim users with skill in C++ programming are Linux users. Theres about 20 xMMs plugins out there.

Good point.  :p

Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #8 on: September 18, 2005, 04:41:31 pm »
Suckers. :)

<3 Ron.

Quote
(13:56:49) Newby1337: I am listening to 10590. Exodus - Fabulous Disaster (3:03 / 4:55 192kbps)
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Towelie

  • pwnstar
  • x86
  • Hero Member
  • *****
  • Posts: 4873
    • View Profile
Re: Gaim Plugin Request
« Reply #9 on: September 18, 2005, 04:42:25 pm »
except I cant use XMMS, so...

Offline Ergot

  • 吴立峰 ^_^ !
  • x86
  • Hero Member
  • *****
  • Posts: 3724
  • I steal bandwidth. p_o
    • View Profile
Re: Gaim Plugin Request
« Reply #10 on: September 18, 2005, 04:47:55 pm »
Suckers. :)

<3 Ron.

Quote
(13:56:49) Newby1337: I am listening to 10590. Exodus - Fabulous Disaster (3:03 / 4:55 192kbps)
(14:05:34) Jimmy: I am listening to 1171. Sugarcult - I Changed My Name (0:00 / 5:40 [stopped] 0kbps)

<3 x2 Ron.
Who gives a damn? I fuck sheep all the time.
And yes, male both ends.  There are a couple lesbians that need a two-ended dildo...My router just refuses to wear a strap-on.
(05:55:03) JoE ThE oDD: omfg good job i got a boner thinkin bout them chinese bitches
(17:54:15) Sidoh: I love cosmetology

Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #11 on: September 18, 2005, 05:09:13 pm »
The problem is that Windows discourages hobby coders.  If somebody is going to invest the hardware and money required to develop software on Windows, they need some kind of return on it.  That's why you rarely see free Windows programs. 

Compiling stuff on Windows takes a lot of set up and configuration, and is over all not fun.  On Linux or Bsd or Unix, I cd into the plugins folder, and tyep "make <pluginname>.so", and it automatically compiled it.  On Windows, I'm not sure what you have to do, but I have yet to figure it out. 

So yeah, Windows is too difficult to compile software on.

As another example, from the xchat website:
Quote
Q. Why isn't the Windows version free?
A. Building X-Chat for Windows is a difficult process, it requires quite some skill and expertise to accomplish. It takes time, and is by no means automated.
There you have it :)

Offline Towelie

  • pwnstar
  • x86
  • Hero Member
  • *****
  • Posts: 4873
    • View Profile
Re: Gaim Plugin Request
« Reply #12 on: September 18, 2005, 08:01:03 pm »
so... no one wants to make it for me :-( Make it on linux, but make it compatible for windows... if thats possible

Offline Quik

  • Webmaster Guy
  • x86
  • Hero Member
  • *****
  • Posts: 3262
  • \x51 \x75 \x69 \x6B \x5B \x78 \x38 \x36 \x5D
    • View Profile
Re: Gaim Plugin Request
« Reply #13 on: September 18, 2005, 08:43:44 pm »
The problem is that Windows discourages hobby coders. If somebody is going to invest the hardware and money required to develop software on Windows, they need some kind of return on it. That's why you rarely see free Windows programs.

Compiling stuff on Windows takes a lot of set up and configuration, and is over all not fun. On Linux or Bsd or Unix, I cd into the plugins folder, and tyep "make <pluginname>.so", and it automatically compiled it. On Windows, I'm not sure what you have to do, but I have yet to figure it out.

So yeah, Windows is too difficult to compile software on.

As another example, from the xchat website:
Quote
Q. Why isn't the Windows version free?
A. Building X-Chat for Windows is a difficult process, it requires quite some skill and expertise to accomplish. It takes time, and is by no means automated.
There you have it :)

Show me where that is on X-Chat's site.
Quote
[20:21:13] xar: i was just thinking about the time iago came over here and we made this huge bomb and light up the sky for 6 min
[20:21:15] xar: that was funny

Offline rabbit

  • x86
  • Hero Member
  • *****
  • Posts: 8092
  • I speak for the entire clan (except Joe)
    • View Profile
Re: Gaim Plugin Request
« Reply #14 on: September 18, 2005, 08:44:32 pm »

Offline Quik

  • Webmaster Guy
  • x86
  • Hero Member
  • *****
  • Posts: 3262
  • \x51 \x75 \x69 \x6B \x5B \x78 \x38 \x36 \x5D
    • View Profile
Re: Gaim Plugin Request
« Reply #15 on: September 18, 2005, 08:46:28 pm »
Quote
[20:21:13] xar: i was just thinking about the time iago came over here and we made this huge bomb and light up the sky for 6 min
[20:21:15] xar: that was funny

Offline Towelie

  • pwnstar
  • x86
  • Hero Member
  • *****
  • Posts: 4873
    • View Profile
Re: Gaim Plugin Request
« Reply #16 on: September 18, 2005, 11:39:36 pm »
Could you guys not go off topic........... I just want to know is
A) is it doable with reasonable amount of work?
B) If anyone is willing to do it?

Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #17 on: September 18, 2005, 11:41:20 pm »
Could you guys not go off topic........... I just want to know is
A) is it doable with reasonable amount of work?
Yes.  A lot of work, but not unreasonable. 

Quote
B) If anyone is willing to do it?
Probably not.  People around here don't seem to care about Windows. 

If anybody is interested, however, I might be able to get some information on how to compile Gaim plugins for Windows.  I don't want to bug the guy, but I will if somebody here wants me to find out. 

Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #18 on: September 18, 2005, 11:52:48 pm »
Probably not.  People around here don't seem to care about Windows. 

And yet the majority of "people" use Windows! :P
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #19 on: September 18, 2005, 11:58:07 pm »
I'm going to laugh when I end up being the one who writes this. -sigh-
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Towelie

  • pwnstar
  • x86
  • Hero Member
  • *****
  • Posts: 4873
    • View Profile
Re: Gaim Plugin Request
« Reply #20 on: September 19, 2005, 12:16:30 am »
start now!

Offline Quik

  • Webmaster Guy
  • x86
  • Hero Member
  • *****
  • Posts: 3262
  • \x51 \x75 \x69 \x6B \x5B \x78 \x38 \x36 \x5D
    • View Profile
Re: Gaim Plugin Request
« Reply #21 on: September 19, 2005, 12:19:20 am »
Could you guys not go off topic........... I just want to know is
A) is it doable with reasonable amount of work?
Yes. A lot of work, but not unreasonable.

Quote
B) If anyone is willing to do it?
Probably not. People around here don't seem to care about Windows.

If anybody is interested, however, I might be able to get some information on how to compile Gaim plugins for Windows. I don't want to bug the guy, but I will if somebody here wants me to find out.

I might be interested in writing this, please contact me with any information you can get.
Quote
[20:21:13] xar: i was just thinking about the time iago came over here and we made this huge bomb and light up the sky for 6 min
[20:21:15] xar: that was funny

Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #22 on: September 19, 2005, 12:30:42 am »
I'm going to laugh when I end up being the one who writes this. -sigh-

You won't finish it. :)
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #23 on: September 19, 2005, 12:48:08 am »
Sure I will. It'll be a leached combo of yPlugin and iago's encoding thing. =)
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #24 on: September 19, 2005, 02:36:42 pm »
I'm guessing that what you need is to install cygwin, go into the "plugins" directory, make your plugin called <pluginname>.c, then compile it by doing "make <pluginname>.dll

Offline rabbit

  • x86
  • Hero Member
  • *****
  • Posts: 8092
  • I speak for the entire clan (except Joe)
    • View Profile
Re: Gaim Plugin Request
« Reply #25 on: September 19, 2005, 05:29:28 pm »
Or you could use MinGW and do "gcc -c -DBUILD_DLL winamp_plugin.c; gcc -shared -o winamp_plugin.dll -Wl,--out-implib,libwinamp_plugin.a winamp_plugin.o"

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #26 on: September 19, 2005, 06:31:14 pm »
char *GetWinampSongTitle(HWND Winamp, DWORD Index) // Winamp 2.04+, pointer is in local address space {
   static char SongTitle[1024];

   DWORD WinampProcessID;
   HANDLE WinampProcess;
   char *SongTitleRemote;
   char *Ret = NULL; // Return value

   GetWindowThreadProcessId(Winamp, &WinampProcessID); // get pid

   if(WinampProcess = OpenProcess(PROCESS_VM_READ, FALSE, WinampProcessID)) { // open process
      if(SongTitleRemote = GetWinampSongTitleRemote(Winamp, Index)) { // get pointer
         if(ReadProcessMemory(WinampProcess, SongTitleRemote, SongTitle, sizeof(SongTitle), NULL)) { // read it
            Ret = SongTitle; // success
         }
      }
      CloseHandle(WinampProcess);
   }

   return Ret;
}


From yPlugin2.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #27 on: September 19, 2005, 06:56:00 pm »
From yPlugin2.

Now all you have to do is stick that in a plugin, make all the appropriate hooks / calls, compile it, and release it, and you'll be done!
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #28 on: September 19, 2005, 06:57:06 pm »
Or you could use MinGW and do "gcc -c -DBUILD_DLL winamp_plugin.c; gcc -shared -o winamp_plugin.dll -Wl,--out-implib,libwinamp_plugin.a winamp_plugin.o"
Don't forget, you have to add Gaim's libraries and include files.  That's why make is handy. 


Offline rabbit

  • x86
  • Hero Member
  • *****
  • Posts: 8092
  • I speak for the entire clan (except Joe)
    • View Profile
Re: Gaim Plugin Request
« Reply #29 on: September 19, 2005, 07:18:51 pm »
This is my entire (incomplete) C++ Winamp code.  There are a few minor things I have left to do, but, whatever:
Code: [Select]
#include <windows.h>
#include <stdio.h>
#include <iostream.h>

HWND__ *hwnd_winamp;

const long IPC_ISPLAYING = 104;
const long IPC_GETOUTPUTTIME    = 105;
const long IPC_SETPLAYLISTPOS   = 121;
const long IPC_SETVOLUME        = 122;
const long IPC_GETLISTLENGTH = 124;
const long IPC_GETLISTPOS = 125;
const long IPC_GETINFO          = 126;
const long IPC_GETPLAYLISTTITLE = 212;
const long WM_WA_IPC = 0x400;
const long WA_DIALOGJUMPTOFILE  = 0x9D02;
const long WA_SENDCUSTOMDATA    = 0x111;
const long WINAMP_BUTTON1       = 40044;
const long WINAMP_BUTTON2       = 40045;
const long WINAMP_BUTTON3       = 40046;
const long WINAMP_BUTTON4       = 40047;
const long WINAMP_BUTTON5       = 40048;
const long xPROCESS_VM_READ = 0x10;

enum playState
{
paused,
playing,
stopped
};

void DoEvents();
long findwinamp();
playState getPlayState();
long GetPlayListLength();
long GetPlayListPosition();
void GetCurrentSongPosition(char *&outbuf);
void GetSongLength(char *&outbuf);
bool JumpToFile(char *sFile);
long SetPlaylistPosition(int pos);
long SetVolume(int vol);
long GetBitrate();
long PrevTrack();
long PlayTrack();
long PauseTrack();
long StopTrack();
long NextTrack();
long GetWinampSongTitleRemote(int index);
char *GetWinampSongTitle(int index);

int main(int argc, char **argv)
{
// it's meant to be a command line driven program!
/*if(argc == 1 || (argc == 2 && argv[1] == "/?"))
{
printf("Invalid arguments.  Use is \n\tclamp <switch> [extra]\n\n");
printf("\tSWITCHES\tDESCRIPTION\n");
printf("\t  /?\t\tList this help\n");
return 1;
}*/

char *buffer = new char[1024];

// get winamp's handle
if(findwinamp() == 0)
{
printf("Error: winamp not found\n");
return 2;
}

// get the title of song 2414 in the playlist ^^
// best used with GetPlayListPosition()
cout << GetWinampSongTitle(2414) << endl;

// get the current playstate
playState check = getPlayState();

if(check == paused)
sprintf(buffer, "%s", "Winamp: Paused");
if(check == playing)
sprintf(buffer, "%s", "Winamp: Playing");
if(check == stopped)
sprintf(buffer, "%s", "Winamp: Stopped");

long pos = GetPlayListPosition();
long len = GetPlayListLength();

// start building the output
sprintf(buffer, "%s; [%i / %i] (", buffer, pos, len);
GetCurrentSongPosition(buffer);
sprintf(buffer, "%s)", buffer);

printf("%s\n", buffer);
return 0;
}

void DoEvents()
{
// stolen from the public DMBot source code
MSG Msg;
while(PeekMessage(&Msg,NULL,0,0,PM_REMOVE))
{
if(Msg.message == WM_QUIT) break;
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}

long findwinamp()
{
hwnd_winamp = FindWindow("Winamp v1.x", NULL);
if(hwnd_winamp != 0)
return 1;
else
return 0;
}

playState getPlayState()
{
long res = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_ISPLAYING);
if(res == 0)
return stopped;
else if(res == 1)
return playing;
else
return paused;
}

long GetPlayListLength()
{
long ret = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_GETLISTLENGTH);
return ret;
}

long GetPlayListPosition()
{
long ret = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_GETLISTPOS) + 1;
return ret;
}

void GetCurrentSongPosition(char *&outbuf)
{
long sec = 0;
long min = 0;
long total = 0;
   
total = SendMessage(hwnd_winamp, WM_WA_IPC, 0, IPC_GETOUTPUTTIME);
min = total / 1000 / 60;
sec = total / 1000 % 60;
if(min < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i:", outbuf, min);

if(sec < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i", outbuf, sec);

return;
}

void GetSongLength(char *&outbuf)
{
long sec = 0;
long min = 0;
long total = 0;
   
total = SendMessage(hwnd_winamp, WM_WA_IPC, 1, IPC_GETOUTPUTTIME);
min = total / 1000 / 60;
sec = total / 1000 % 60;
if(min < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i:", outbuf, min);

if(sec < 10) sprintf(outbuf, "%s%i", outbuf, 0);
sprintf(outbuf, "%s%i", outbuf, sec);

return;
}

bool JumpToFile(char *sFile)
{
HWND__ *jumpTo = 0;
HWND__ *edit = 0;
HWND__ *listBox = 0;

if(hwnd_winamp == 0x0)
return false;

PostMessage(hwnd_winamp, WA_SENDCUSTOMDATA, WA_DIALOGJUMPTOFILE, 0x0);

do
{
DoEvents();
jumpTo = FindWindow("#32770", "Jump to file");
edit = FindWindowEx(jumpTo, 0x0, "Edit", NULL);
listBox = FindWindowEx(jumpTo, 0x0, "ListBox", NULL);
} while(jumpTo == 0x0 || edit == 0x0 || listBox == 0x0);

SendMessage(edit, 0x0c, 0x0, (LPARAM)sFile);
DoEvents();
if(SendMessage(listBox, 0x18b, 0x0, 0x0) == 0x0)
PostMessage(jumpTo, 0x10, 0x0, 0x0);
else
SendMessage(listBox, 0x203, 0x0, (long)0x0);

return true;
}

long SetPlaylistPosition(int pos)
{
return SendMessage(hwnd_winamp, WM_WA_IPC, pos - 1, IPC_SETPLAYLISTPOS);
}

long SetVolume(int vol)
{
return SendMessage(hwnd_winamp, WM_WA_IPC, vol, IPC_SETVOLUME);
}

long GetBitrate()
{
return SendMessage(hwnd_winamp, WM_WA_IPC, 1, IPC_GETINFO);
}

char *GetChannels()
{
char *ret = new char[15];
long check = SendMessage(hwnd_winamp, WM_WA_IPC, 2, IPC_GETINFO);
switch(check)
{
case 0:
ret = "No Speakers";
break;
case 1:
ret = "Mono";
break;
case 2:
ret = "Stereo";
break;
default:
ret = "Surround-Sound";
break;
}

return ret;
}

long PrevTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON1, 0);
}

long PlayTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON2, 0);
}

long PauseTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON3, 0);
}

long StopTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON4, 0);
}

long NextTrack()
{
return SendMessage(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON5, 0);
}

long GetWinampSongTitleRemote(int index)
{
return SendMessage(hwnd_winamp, WM_WA_IPC, index, IPC_GETPLAYLISTTITLE);
}

char *GetWinampSongTitle(int index)
{
char *title = new char[1024];
DWORD ProcessID = 0;
HANDLE ProcessHandle = 0;
long TitleRemote = 0;

ProcessID = GetWindowThreadProcessId((HWND)hwnd_winamp, (LPDWORD)ProcessID);
cout << "ProcessID: " << ProcessID << endl;
ProcessHandle = OpenProcess((DWORD)0x10, false, ProcessID);
cout << "ProcessHandle: " << ProcessHandle << endl;
if(ProcessHandle != 0)
{
TitleRemote = GetWinampSongTitleRemote(index);
cout << "TitleRemote: " << TitleRemote << endl;
if(TitleRemote != 0)
{
if(ReadProcessMemory((HANDLE)ProcessHandle, (LPCVOID)TitleRemote, (LPVOID)title, (DWORD)sizeof(title), (LPDWORD)0) != 0)
{
CloseHandle(ProcessHandle);
return title;
}
}
CloseHandle(ProcessHandle);
}
return "Error: Song Not Found";
}

Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #30 on: September 19, 2005, 07:22:21 pm »
You guys have the easy shit down.

Writing the gaim plugin is the hard part. =P
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #31 on: September 19, 2005, 07:49:13 pm »
http://www.javaop.com/~joe/gaimwinamp.c

IAGO I AM SO SO SO SO SORRY

EDIT -
For those of you who just got lost, poke.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #32 on: September 19, 2005, 07:52:05 pm »
Compile a DLL!

Once Towelie has a DLL and sends his current playing song to me, I bow to you.
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #33 on: September 19, 2005, 07:53:25 pm »
Damn straight you will. *taps foot impatiently at cygwin's download speed*
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #34 on: September 19, 2005, 09:30:02 pm »
String mp3() {
   String title;
   HWND HwndWamp;
   int len;
   
   HwndWamp = FindWindow("Winamp v1.x", "");
   if(HwndWamp = 0) {
      return "Winamp not found.";
   }else{
     len = GetWindowTextLength(HwndWamp) + 1;
     GetWindowText(HwndWamp, title, len);
     title = title.substr(0, strlen(title) - 1);
     title = title.substr(0, strlen(title) - 9);
     return title;
   }
}


I have three dollars on newby. =)
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #35 on: September 19, 2005, 09:38:50 pm »
String? Ick.

Get this working and compiled, you bum. If you get it working, I'll install Windows on VMWare and make the plugin sexy. I've wanted to write one for Windows, but lack of a good start / now using Linux stopped me. :O
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #36 on: September 19, 2005, 09:49:08 pm »
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #37 on: September 19, 2005, 09:52:01 pm »
Gaim is C, and Gaim plugins are C.  I couldn't see String working, for 2 reasons: There is only a String class in C++, and it's "string" or "std::string", not "String".  C/C++ are case sensitive. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #38 on: September 19, 2005, 10:31:59 pm »
I was going by Java. =)
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline MyndFyre

  • Boticulator Extraordinaire
  • x86
  • Hero Member
  • *****
  • Posts: 4540
  • The wait is over.
    • View Profile
    • JinxBot :: the evolution in boticulation
Re: Gaim Plugin Request
« Reply #39 on: September 19, 2005, 10:54:07 pm »
I was going by Java. =)
...which was wrong.
I have a programming folder, and I have nothing of value there

Running with Code has a new home!

Our species really annoys me.

Offline Towelie

  • pwnstar
  • x86
  • Hero Member
  • *****
  • Posts: 4873
    • View Profile
Re: Gaim Plugin Request
« Reply #40 on: September 19, 2005, 11:22:25 pm »
so...... anyone else want to attempt? :-(

Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #41 on: September 20, 2005, 12:05:17 am »
C and Java are quite different, especially when it comes to stringing. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #42 on: September 21, 2005, 05:17:58 pm »
I changed it to a *char. Anyhow, I give up. Again. Heres my code:
Requires the winamp headers from yPlugin.

Code: [Select]
// Credit -
// Joe[e2]: Author
// iago[x86]: Original XMMS Plugin

#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "WinampFunctions.h"

#include "internal.h"
#include "gtkgaim.h"

#include "debug.h"
#include "signals.h"
#include "util.h"
#include "version.h"
#include "cmds.h"
#include "conversation.h"

#include "gtkplugin.h"
#include "gtkutils.h"

#include <windows.h>

//Plugin info - iago[x86]
#define VERSION "0.1.1"
#define ME "Winamp Plugin"
#define MAXLENGTH 1024
#define XMMS_PLUGIN_VERSION "I am using Winamp Plugin v1.0.1 written by Joe with very special thanks to iago and Yoni."

//Handle to the procedures to handle commands - iago[x86]
static GaimCmdId noargcmd;

//write_conversation - iago[x86]
void write_conversation(GaimConversation *conv, const char *message) {
  gaim_conversation_write(conv, "", message, GAIM_MESSAGE_NO_LOG, time( NULL ));
}

// WampNoParams - Joe[e2]/iago[x86]
gboolean WampNoParams(GaimConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) {
  write_conversation("Current MP3: " + mp3());
  return GAIM_CMD_STATUS_OK;
}

// plugin_load - Joe[e2]/iago[x86]
static gboolean plugin_load(GaimPlugin *plugin) {
  noargcmd  = gaim_cmd_register("winamp", "",   GAIM_CMD_P_DEFAULT, GAIM_CMD_FLAG_IM, NULL, (GaimCmdFunc)WampNoParams,    "/Wamp", NULL);
  return TRUE;
}

static gboolean plugin_unload(GaimPlugin *plugin) {
  gaim_cmd_unregister (noargcmd);
  return TRUE;
}


static GaimPluginInfo info = {
  GAIM_PLUGIN_MAGIC,
  GAIM_MAJOR_VERSION,
  GAIM_MINOR_VERSION,
  GAIM_PLUGIN_STANDARD,                                     /* type             */
  NULL,                                                     /* ui_requirement   */
  0,                                                        /* flags            */
  NULL,                                                     /* dependencies     */
  GAIM_PRIORITY_DEFAULT,                                    /* priority         */
  NULL,                                                     /* id               */
  N_("Winamp Plugin"),                                      /* name             */
  VERSION,                                                  /* version          */
  N_("Allows use of the /mp3 command."),                    /* summary          */
  N_("Allows use of the /mp3 command."),                    /* description      */
  "Joe <joetheodd@gmail.com",                               /* author           */
  "http://www.x86labs.org",                                 /* homepage         */
  plugin_load,                                              /* load             */
  plugin_unload,                                            /* unload           */
  NULL,                                                     /* destroy          */
  NULL,                                                     /* ui_info          */
  NULL,                                                     /* extra_info       */
  NULL,
  NULL
};


// stolen from iago[x86]
static void init_plugin(GaimPlugin *plugin) {
}

GAIM_INIT_PLUGIN(XMMSPlugin, init_plugin, info)

// mp3
/*
char() mp3() {
String title;
HWND HwndWamp;
int len;
HwndWamp = FindWindow("Winamp v1.x", "");
if(HwndWamp = 0) {
return "Winamp not found.";
}else{
  len = GetWindowTextLength(HwndWamp) + 1;
  GetWindowText(HwndWamp, title, len);
  title = title.substr(0, strlen(title) - 1);
  title = title.substr(0, strlen(title) - 9);
  return title;
}
}
*/

char *mp3(HWND Winamp, DWORD Index) /* Winamp 2.04+, pointer is in local address space */ {
static char SongTitle[1024];

DWORD WinampProcessID;
HANDLE WinampProcess;
char *SongTitleRemote;
char Ret = NULL; // Return value

// Get process ID
GetWindowThreadProcessId(Winamp, &WinampProcessID);

// Open process
if(WinampProcess = OpenProcess(PROCESS_VM_READ, FALSE, WinampProcessID)) {
// Get pointer
if(SongTitleRemote = GetWinampSongTitleRemote(Winamp, Index))
// Try to read it
if(ReadProcessMemory(WinampProcess, SongTitleRemote, SongTitle, sizeof(SongTitle), NULL))
// Success
Ret = SongTitle;

CloseHandle(WinampProcess);
}

return *Ret;
}
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Sidoh

  • x86
  • Hero Member
  • *****
  • Posts: 17634
  • MHNATY ~~~~~
    • View Profile
    • sidoh
Re: Gaim Plugin Request
« Reply #43 on: September 21, 2005, 05:26:58 pm »
Does it work? =P

Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #44 on: September 21, 2005, 05:28:15 pm »
Joe gave up. I knew it. :)
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #45 on: September 21, 2005, 05:59:10 pm »
Shut up, I've suspended my effort indefinantly. I'll be back at it in a year or so. The only way to stop me is to write one first. GO!
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline MyndFyre

  • Boticulator Extraordinaire
  • x86
  • Hero Member
  • *****
  • Posts: 4540
  • The wait is over.
    • View Profile
    • JinxBot :: the evolution in boticulation
Re: Gaim Plugin Request
« Reply #46 on: September 21, 2005, 06:34:17 pm »
I changed it to a *char. Anyhow, I give up. Again. Heres my code:
Why not to a char*?
I have a programming folder, and I have nothing of value there

Running with Code has a new home!

Our species really annoys me.

Offline rabbit

  • x86
  • Hero Member
  • *****
  • Posts: 8092
  • I speak for the entire clan (except Joe)
    • View Profile
Re: Gaim Plugin Request
« Reply #47 on: September 21, 2005, 06:35:22 pm »
Because Joe doesn't know C, duh.

@Joe: I quit DK almost a year ago :\

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #48 on: September 21, 2005, 07:02:02 pm »
Hee hee. k.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #49 on: September 21, 2005, 07:23:59 pm »
Shut up, I've suspended my effort indefinantly. I'll be back at it in a year or so. The only way to stop me is to write one first. GO!

You'll never finish it! :(
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline MyndFyre

  • Boticulator Extraordinaire
  • x86
  • Hero Member
  • *****
  • Posts: 4540
  • The wait is over.
    • View Profile
    • JinxBot :: the evolution in boticulation
Re: Gaim Plugin Request
« Reply #50 on: September 21, 2005, 10:10:37 pm »
You'll never finish it! :(
Correct, but he'll put five minutes of effort into it in a year.
I have a programming folder, and I have nothing of value there

Running with Code has a new home!

Our species really annoys me.

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #51 on: September 21, 2005, 10:54:08 pm »
Quote
Correct, but he'll put five minutes of effort into it in a year.

I slaved over that thing for five hours. I'm sorry to say this, but if its so easy, do it.

PLEASE!!!

=p
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Sidoh

  • x86
  • Hero Member
  • *****
  • Posts: 17634
  • MHNATY ~~~~~
    • View Profile
    • sidoh
Re: Gaim Plugin Request
« Reply #52 on: September 22, 2005, 12:05:30 am »
He never said it was easy.  (Though from the looks of it, with a sufficient amount of C++ knowledge it would be).

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #53 on: October 08, 2005, 04:23:00 pm »
http://www.ews.uiuc.edu/~rbalik2/musicinfo/musicinfo.c (Ergot linked me to it)

But thats the source code. I'm not on Windows, and I don't know how to compile a DLL from that even if I were.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Ergot

  • 吴立峰 ^_^ !
  • x86
  • Hero Member
  • *****
  • Posts: 3724
  • I steal bandwidth. p_o
    • View Profile
Re: Gaim Plugin Request
« Reply #54 on: October 08, 2005, 04:34:22 pm »
Because I didn't want to bump this topic ;/ ? Thanks for ruining it :P
Who gives a damn? I fuck sheep all the time.
And yes, male both ends.  There are a couple lesbians that need a two-ended dildo...My router just refuses to wear a strap-on.
(05:55:03) JoE ThE oDD: omfg good job i got a boner thinkin bout them chinese bitches
(17:54:15) Sidoh: I love cosmetology

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #55 on: October 08, 2005, 06:06:06 pm »
You're welcome.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline iago

  • Leader
  • Administrator
  • Hero Member
  • *****
  • Posts: 17914
  • Fnord.
    • View Profile
    • SkullSecurity
Re: Gaim Plugin Request
« Reply #56 on: October 08, 2005, 10:59:26 pm »
Bumping a topic is fine if you have useful information to add to it. 

Offline Quik

  • Webmaster Guy
  • x86
  • Hero Member
  • *****
  • Posts: 3262
  • \x51 \x75 \x69 \x6B \x5B \x78 \x38 \x36 \x5D
    • View Profile
Re: Gaim Plugin Request
« Reply #57 on: October 09, 2005, 03:28:31 am »
I have chatted with Yoni about possibly using his code for yPlugin2 in conjunction with code I find (or Ergot finds) to create a plugin for Gaim (on Windows) that has most, if not all, of the features as yPlugin2. Hopefully I'll actually do it.
Quote
[20:21:13] xar: i was just thinking about the time iago came over here and we made this huge bomb and light up the sky for 6 min
[20:21:15] xar: that was funny

Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #58 on: October 09, 2005, 11:52:50 am »
You don't know enough C/C++ to do it. :)

Having Yoni do it = cheating.
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Quik

  • Webmaster Guy
  • x86
  • Hero Member
  • *****
  • Posts: 3262
  • \x51 \x75 \x69 \x6B \x5B \x78 \x38 \x36 \x5D
    • View Profile
Re: Gaim Plugin Request
« Reply #59 on: October 09, 2005, 03:44:23 pm »
You don't know enough C/C++ to do it. :)

Having Yoni do it = cheating.

Nobody says modifying open source code provided to you is cheating. yPlugin2 is licensed under the GSL:

Quote
(17:28:38) Yoni @ ALSA!: 
 Licensed under the Generally Silly License (GSL) 
   
 PREAMBLE 
   
 0. This license applies. 
 1. You may copy and distribute. 
 2. You may modify. 
 3. You may copy and distribute. 
 4. You may not. 
 5. You are not required. 
 6. Each time you redistribute. 
 7. If, as a consequence of a court judgment. 
 8. If the distribution and/or. 
 9. The. 
 10. If you wish. 
   
 NO WARRANTY 
   
 11. BECAUSE. 
 12. IN NO EVENT.

Oh, and with newby's vast, gigantic, amazing amount of C/++ knowledge and the resources at hand, it wouldn't be that damn complicated to do.
« Last Edit: October 11, 2005, 08:56:13 pm by Quik »
Quote
[20:21:13] xar: i was just thinking about the time iago came over here and we made this huge bomb and light up the sky for 6 min
[20:21:15] xar: that was funny

Offline Joe

  • B&
  • Moderator
  • Hero Member
  • *****
  • Posts: 10319
  • In Soviet Russia, text read you!
    • View Profile
    • Github
Re: Gaim Plugin Request
« Reply #60 on: October 09, 2005, 04:11:17 pm »
Paraphrased..

Quote
Generally Silly License (GSL)
 1. You may copy and distribute.
 NO WARRANTY BECAUSE.
I'd personally do as Joe suggests

You might be right about that, Joe.


Offline Newby

  • Moderator
  • Hero Member
  • *****
  • Posts: 10877
  • Thrash!
    • View Profile
Re: Gaim Plugin Request
« Reply #61 on: October 10, 2005, 10:46:22 pm »
Nobody says modifying open source code provided to you is cheating. yPlugin2 is licensed under the GSL:

Oh, and with my amount of C/++ knowledge and the resources at hand, it wouldn't be that damn complicated to do.

Well, good luck to you, I don't think you can do it. [size=0pt]</motivation>[/size]:)
- Newby
http://www.x86labs.org

Quote
[17:32:45] * xar sets mode: -oooooooooo algorithm ban chris cipher newby stdio TehUser tnarongi|away vursed warz
[17:32:54] * xar sets mode: +o newby
[17:32:58] <xar> new rule
[17:33:02] <xar> me and newby rule all

I'd bet that you're currently bloated like a water ballon on a hot summer's day.

That analogy doesn't even make sense.  Why would a water balloon be especially bloated on a hot summer's day? For your sake, I hope there wasn't too much logic testing on your LSAT. 

Offline Sidoh

  • x86
  • Hero Member
  • *****
  • Posts: 17634
  • MHNATY ~~~~~
    • View Profile
    • sidoh
Re: Gaim Plugin Request
« Reply #62 on: October 11, 2005, 01:53:01 am »
Hahaha, Newby.

I love you.  :)

Offline Ergot

  • 吴立峰 ^_^ !
  • x86
  • Hero Member
  • *****
  • Posts: 3724
  • I steal bandwidth. p_o
    • View Profile
Re: Gaim Plugin Request
« Reply #63 on: October 11, 2005, 03:25:19 am »
Nobody says modifying open source code provided to you is cheating. yPlugin2 is licensed under the GSL:

Oh, and with my amount of C/++ knowledge and the resources at hand, it wouldn't be that damn complicated to do.

Well, good luck to you, I don't think you can do it. [size=0pt]</motivation>[/size]:)
This coming from the guy that couldn't help me with my dangerously easy C project ;P
Who gives a damn? I fuck sheep all the time.
And yes, male both ends.  There are a couple lesbians that need a two-ended dildo...My router just refuses to wear a strap-on.
(05:55:03) JoE ThE oDD: omfg good job i got a boner thinkin bout them chinese bitches
(17:54:15) Sidoh: I love cosmetology