summary refs log tree commit diff stats
path: root/plugins/ewc/ewc.c
blob: ff9d776a5a24674b2a32e14150958cab2d4a4188 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
EasyWinampControl - A Winamp "What's playing" plugin for Xchat
Copyright (C) Yann HAMON & contributors

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include "xchat-plugin.h"
#include <windows.h>

static xchat_plugin *ph;   /* plugin handle */
static int enable = 1;

// For example, circularstrstr("winamp", "pwi", 3) would return 5 (the index of p)
int circularstrstr(char* a, char* b, int nb)
{
  int equal = 1;
  int length;
  int pos=-1;
  int i, j;

  length = strlen(a);

  for (i=0; i<length && pos == -1; ++i) {
    equal = 1;
    for (j=0; j<nb;j++) {
      if (a[(i+j)%length] != b[j])
        equal = 0;
    }
    if (equal == 1)
      pos = i;
  }

  return pos;
}

void GetCurrentSongsName(HWND hwndWinamp, char* title, int titlesize)
{
  int pos;
  char *title2;
  int i, j=0;
  int length;
  char *p;

  GetWindowText(hwndWinamp, title, titlesize);
  length = strlen(title);

  if ((pos = circularstrstr(title, "- Winamp ***", 12)) != -1) {
    // The option "scroll song title in taskbar" is on
    title2 = (char*) malloc (titlesize*sizeof(char));

    for (i=(pos+12)%length; i!=pos; i=(i+1)%length)
      title2[j++] = title[i];

    title2[j] = '\0';

    p = title2;
    while (p<title2+titlesize && *p != '.')
      p++;
    p+=2; // Delete the . and the following white space

    strcpy(title, p);
    free(title2);
  }
  else {
    p = title;
    while (p<title+titlesize && *p != '.')
      p++;
    p+=2; // Delete the . and the following white space
    if (p<title+titlesize)
      strncpy(title, p, titlesize-(p-title));

    // Delete the trailing "- winamp"
    p = title + titlesize - 1;
    while (p>title && *p != '-') p--;
    *p = '\0';
  }
}


// Controlling winamp
static int wcmd_cb(char *word[], char *word_eol[], void *userdata)
{
  // Everything's here : http://winamp.com/nsdn/winamp2x/dev/sdk/api.php
  // The previous url seems dead, see http://forums.winamp.com/showthread.php?threadid=180297
  HWND hwndWinamp = NULL;

  if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL) {
    xchat_print(ph, "Winamp's window not found - Is winamp really running?\n");
  }
  else {
    if (strcmp(word[1], "") == 0)
      xchat_print(ph, "Usage: wcmd [command]\n");
    else if (strcmp(word[2], "next") == 0) {
      xchat_print(ph, "Loading next song...\n");
      SendMessage (hwndWinamp, WM_COMMAND, 40048, 0);
    }
    else if (strcmp(word[2], "prev") == 0) {
      xchat_print(ph, "Loading previous song...\n");
      SendMessage (hwndWinamp, WM_COMMAND, 40044, 0);
    }
    else if (strcmp(word[2], "play") == 0) {
      xchat_print(ph, "Playin'...\n");
      SendMessage (hwndWinamp, WM_COMMAND, 40045, 0);
    }
    else if (strcmp(word[2], "stop") == 0) {
      xchat_print(ph, "Winamp stopped!...\n");
      SendMessage (hwndWinamp, WM_COMMAND, 40047, 0);
    }
    else if (strcmp(word[2], "pause") == 0) {
      SendMessage (hwndWinamp, WM_COMMAND, 40046, 0);
    }
  }

  return XCHAT_EAT_ALL;
}


// Display current song
static int wp_cb(char *word[], char *word_eol[], void *userdata)
{
  HWND hwndWinamp = NULL;
  int bitrate, length, elapsed, minutes, seconds, eminutes, eseconds, samplerate, nbchannels;
  char elapsedtime[7];
  char totaltime[7];
  char this_title[1024];

  if ((hwndWinamp = FindWindow("Winamp v1.x",NULL)) == NULL)
    xchat_print(ph, "Winamp's window not found - Is winamp really running?\n");
  else {
    //Winamp's running
    // Seems buggy when winamp2's agent is running, and winamp not (or winamp3) -> crashes xchat.
    SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)125);

    if ((samplerate = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)126)) == 0) {
      xchat_print(ph, "Could not get current song's samplerate... !?\n");
      return XCHAT_EAT_ALL;
    }
    if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) {
      xchat_print(ph, "Could not get current song's bitrate... !?\n");
      return XCHAT_EAT_ALL;
    }
    if ((nbchannels = SendMessage(hwndWinamp, WM_USER, (WPARAM)2, (LPARAM)126)) == 0) {
      xchat_print(ph, "Could not get the number of channels... !?\n");
      return XCHAT_EAT_ALL;
    }
    if ((length = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)105)) == 0) {
      // Could be buggy when streaming audio or video, returned length is unexpected;
      // How to detect is Winamp is streaming, and display ??:?? in that case?
      xchat_print(ph, "Could not get current song's length... !?\n");
      return XCHAT_EAT_ALL;
    }
    else {
      minutes = length/60;
      seconds = length%60;

      if (seconds>9)
        wsprintf(totaltime, "%d:%d", minutes, seconds);
      else
        wsprintf(totaltime, "%d:0%d", minutes, seconds);
    }
    if ((elapsed = SendMessage(hwndWinamp, WM_USER, (WPARAM)0, (LPARAM)105)) == 0) {
      xchat_print(ph, "Could not get current song's elapsed time... !?\n");
      return XCHAT_EAT_ALL;
    }
    else {
      eminutes = (elapsed/1000)/60;   /* kinda stupid sounding, but e is for elapsed */
      eseconds = (elapsed/1000)%60;

      if (eseconds>9)
        wsprintf(elapsedtime, "%d:%d", eminutes, eseconds);
      else
        wsprintf(elapsedtime, "%d:0%d", eminutes, eseconds);
    }

    if ((bitrate = SendMessage(hwndWinamp, WM_USER, (WPARAM)1, (LPARAM)126)) == 0) {
      xchat_print(ph, "Could not get current song's bitrate... !?\n");
      return XCHAT_EAT_ALL;
    }

    GetCurrentSongsName(hwndWinamp, this_title, 1024);

    xchat_commandf(ph, "dispcurrsong %d %d %d %s %s %s", samplerate, bitrate, nbchannels, elapsedtime, totaltime, this_title);
  }

  return XCHAT_EAT_ALL;   /* eat this command so xchat and other plugins can't process it */
}



int xchat_plugin_init(xchat_plugin *plugin_handle,
                      char **plugin_name,
                      char **plugin_desc,
                      char **plugin_version,
                      char *arg)
{
  /* we need to save this for use with any xchat_* functions */
  ph = plugin_handle;

  *plugin_name = "EasyWinampControl";
  *plugin_desc = "Some commands to remotely control winamp";
  *plugin_version = "1.2";

  xchat_hook_command(ph, "wp", XCHAT_PRI_NORM, wp_cb,
                    "Usage: wp", 0);

  xchat_hook_command(ph, "wcmd", XCHAT_PRI_NORM, wcmd_cb,
                    "Usage: wcmd [play|pause|stop|prev|next]", 0);

  xchat_print(ph, "EasyWinampControl 1.2 plugin loaded successfully!\n");

  return 1;       /* return 1 for success */
}

int xchat_plugin_deinit(void)
{
  xchat_print(ph, "EasyWinampControl 1.2 plugin unloaded successfully!\n");
  return 1;
}
f">hexchat_hook_command (hexchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], void *user_data), const char *help_text, void *userdata); hexchat_event_attrs *hexchat_event_attrs_create (hexchat_plugin *ph); void hexchat_event_attrs_free (hexchat_plugin *ph, hexchat_event_attrs *attrs); hexchat_hook * hexchat_hook_server (hexchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], void *user_data), void *userdata); hexchat_hook * hexchat_hook_server_attrs (hexchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], char *word_eol[], hexchat_event_attrs *attrs, void *user_data), void *userdata); hexchat_hook * hexchat_hook_print (hexchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], void *user_data), void *userdata); hexchat_hook * hexchat_hook_print_attrs (hexchat_plugin *ph, const char *name, int pri, int (*callback) (char *word[], hexchat_event_attrs *attrs, void *user_data), void *userdata); hexchat_hook * hexchat_hook_timer (hexchat_plugin *ph, int timeout, int (*callback) (void *user_data), void *userdata); hexchat_hook * hexchat_hook_fd (hexchat_plugin *ph, int fd, int flags, int (*callback) (int fd, int flags, void *user_data), void *userdata); void * hexchat_unhook (hexchat_plugin *ph, hexchat_hook *hook); void hexchat_print (hexchat_plugin *ph, const char *text); void hexchat_printf (hexchat_plugin *ph, const char *format, ...); void hexchat_command (hexchat_plugin *ph, const char *command); void hexchat_commandf (hexchat_plugin *ph, const char *format, ...); int hexchat_nickcmp (hexchat_plugin *ph, const char *s1, const char *s2); int hexchat_set_context (hexchat_plugin *ph, hexchat_context *ctx); hexchat_context * hexchat_find_context (hexchat_plugin *ph, const char *servname, const char *channel); hexchat_context * hexchat_get_context (hexchat_plugin *ph); const char * hexchat_get_info (hexchat_plugin *ph, const char *id); int hexchat_get_prefs (hexchat_plugin *ph, const char *name, const char **string, int *integer); hexchat_list * hexchat_list_get (hexchat_plugin *ph, const char *name); void hexchat_list_free (hexchat_plugin *ph, hexchat_list *xlist); const char * const * hexchat_list_fields (hexchat_plugin *ph, const char *name); int hexchat_list_next (hexchat_plugin *ph, hexchat_list *xlist); const char * hexchat_list_str (hexchat_plugin *ph, hexchat_list *xlist, const char *name); int hexchat_list_int (hexchat_plugin *ph, hexchat_list *xlist, const char *name); time_t hexchat_list_time (hexchat_plugin *ph, hexchat_list *xlist, const char *name); void * hexchat_plugingui_add (hexchat_plugin *ph, const char *filename, const char *name, const char *desc, const char *version, char *reserved); void hexchat_plugingui_remove (hexchat_plugin *ph, void *handle); int hexchat_emit_print (hexchat_plugin *ph, const char *event_name, ...); int hexchat_emit_print_attrs (hexchat_plugin *ph, hexchat_event_attrs *attrs, const char *event_name, ...); char * hexchat_gettext (hexchat_plugin *ph, const char *msgid); void hexchat_send_modes (hexchat_plugin *ph, const char **targets, int ntargets, int modes_per_line, char sign, char mode); char * hexchat_strip (hexchat_plugin *ph, const char *str, int len, int flags); void hexchat_free (hexchat_plugin *ph, void *ptr); int hexchat_pluginpref_set_str (hexchat_plugin *ph, const char *var, const char *value); int hexchat_pluginpref_get_str (hexchat_plugin *ph, const char *var, char *dest); int hexchat_pluginpref_set_int (hexchat_plugin *ph, const char *var, int value); int hexchat_pluginpref_get_int (hexchat_plugin *ph, const char *var); int hexchat_pluginpref_delete (hexchat_plugin *ph, const char *var); int hexchat_pluginpref_list (hexchat_plugin *ph, char *dest); #if !defined(PLUGIN_C) && defined(WIN32) #ifndef HEXCHAT_PLUGIN_HANDLE #define HEXCHAT_PLUGIN_HANDLE (ph) #endif #define hexchat_hook_command ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_command) #define hexchat_event_attrs_create ((HEXCHAT_PLUGIN_HANDLE)->hexchat_event_attrs_create) #define hexchat_event_attrs_free ((HEXCHAT_PLUGIN_HANDLE)->hexchat_event_attrs_free) #define hexchat_hook_server ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_server) #define hexchat_hook_server_attrs ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_server_attrs) #define hexchat_hook_print ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_print) #define hexchat_hook_print_attrs ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_print_attrs) #define hexchat_hook_timer ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_timer) #define hexchat_hook_fd ((HEXCHAT_PLUGIN_HANDLE)->hexchat_hook_fd) #define hexchat_unhook ((HEXCHAT_PLUGIN_HANDLE)->hexchat_unhook) #define hexchat_print ((HEXCHAT_PLUGIN_HANDLE)->hexchat_print) #define hexchat_printf ((HEXCHAT_PLUGIN_HANDLE)->hexchat_printf) #define hexchat_command ((HEXCHAT_PLUGIN_HANDLE)->hexchat_command) #define hexchat_commandf ((HEXCHAT_PLUGIN_HANDLE)->hexchat_commandf) #define hexchat_nickcmp ((HEXCHAT_PLUGIN_HANDLE)->hexchat_nickcmp) #define hexchat_set_context ((HEXCHAT_PLUGIN_HANDLE)->hexchat_set_context) #define hexchat_find_context ((HEXCHAT_PLUGIN_HANDLE)->hexchat_find_context) #define hexchat_get_context ((HEXCHAT_PLUGIN_HANDLE)->hexchat_get_context) #define hexchat_get_info ((HEXCHAT_PLUGIN_HANDLE)->hexchat_get_info) #define hexchat_get_prefs ((HEXCHAT_PLUGIN_HANDLE)->hexchat_get_prefs) #define hexchat_list_get ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_get) #define hexchat_list_free ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_free) #define hexchat_list_fields ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_fields) #define hexchat_list_next ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_next) #define hexchat_list_str ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_str) #define hexchat_list_int ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_int) #define hexchat_plugingui_add ((HEXCHAT_PLUGIN_HANDLE)->hexchat_plugingui_add) #define hexchat_plugingui_remove ((HEXCHAT_PLUGIN_HANDLE)->hexchat_plugingui_remove) #define hexchat_emit_print ((HEXCHAT_PLUGIN_HANDLE)->hexchat_emit_print) #define hexchat_emit_print_attrs ((HEXCHAT_PLUGIN_HANDLE)->hexchat_emit_print_attrs) #define hexchat_list_time ((HEXCHAT_PLUGIN_HANDLE)->hexchat_list_time) #define hexchat_gettext ((HEXCHAT_PLUGIN_HANDLE)->hexchat_gettext) #define hexchat_send_modes ((HEXCHAT_PLUGIN_HANDLE)->hexchat_send_modes) #define hexchat_strip ((HEXCHAT_PLUGIN_HANDLE)->hexchat_strip) #define hexchat_free ((HEXCHAT_PLUGIN_HANDLE)->hexchat_free) #define hexchat_pluginpref_set_str ((HEXCHAT_PLUGIN_HANDLE)->hexchat_pluginpref_set_str) #define hexchat_pluginpref_get_str ((HEXCHAT_PLUGIN_HANDLE)->hexchat_pluginpref_get_str) #define hexchat_pluginpref_set_int ((HEXCHAT_PLUGIN_HANDLE)->hexchat_pluginpref_set_int) #define hexchat_pluginpref_get_int ((HEXCHAT_PLUGIN_HANDLE)->hexchat_pluginpref_get_int) #define hexchat_pluginpref_delete ((HEXCHAT_PLUGIN_HANDLE)->hexchat_pluginpref_delete) #define hexchat_pluginpref_list ((HEXCHAT_PLUGIN_HANDLE)->hexchat_pluginpref_list) #endif #ifdef __cplusplus } #endif #endif