Загрузить файлы в «/»
This commit is contained in:
parent
7fbfa38f64
commit
dbb24457e3
8
Makefile
Normal file
8
Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
CFLAGS?=-s -O0
|
||||
CC?=cc
|
||||
|
||||
all:
|
||||
$(CC) $(CFLAGS) -omain *.c
|
||||
|
||||
clean:
|
||||
rm main
|
6
cfg.h
Normal file
6
cfg.h
Normal file
@ -0,0 +1,6 @@
|
||||
//Settings
|
||||
#define NICK "gamepadbot"
|
||||
#define HOST "localhost"
|
||||
#define PORT 6667
|
||||
|
||||
char *channels[] = {"#channel"};
|
147
main.c
Normal file
147
main.c
Normal file
@ -0,0 +1,147 @@
|
||||
#include "irc.h"
|
||||
#include "cfg.h"
|
||||
#include <sys/time.h>
|
||||
#include <linux/uinput.h>
|
||||
#include <fcntl.h>
|
||||
IRCC_client client;
|
||||
|
||||
void die(const char *msg) {
|
||||
puts(msg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
void emit(int fd, int type, int code, int val) {
|
||||
struct input_event ie;
|
||||
|
||||
ie.type = type;
|
||||
ie.code = code;
|
||||
ie.value = val;
|
||||
|
||||
ie.time.tv_sec = 0;
|
||||
ie.time.tv_usec = 0;
|
||||
|
||||
write(fd, &ie, sizeof(ie));
|
||||
}
|
||||
|
||||
void press(int fd, int event) {
|
||||
emit(fd, EV_KEY, event, 1);
|
||||
emit(fd, EV_SYN, SYN_REPORT, 0);
|
||||
|
||||
usleep(200000);
|
||||
|
||||
emit(fd, EV_KEY, event, 0);
|
||||
emit(fd, EV_SYN, SYN_REPORT, 0);
|
||||
}
|
||||
|
||||
void recvinfo(int fd) {
|
||||
while (1) {
|
||||
unsigned int irc_status = IRCC_recv(&client);
|
||||
if (irc_status == IRCC_DISCONNECTED)
|
||||
die("Disconnected");
|
||||
|
||||
else if (client.msg != NULL && irc_status == IRCC_PRIVMSG) {
|
||||
for (int i = 0; i < strlen(client.msg); i++) {
|
||||
usleep(20000);
|
||||
switch (client.msg[i]) {
|
||||
case 'w':
|
||||
press(fd, KEY_UP);
|
||||
break;
|
||||
|
||||
case 's':
|
||||
press(fd, KEY_DOWN);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
press(fd, KEY_LEFT);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
press(fd, KEY_RIGHT);
|
||||
break;
|
||||
|
||||
case 'z':
|
||||
press(fd, KEY_Z);
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
press(fd, KEY_X);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
press(fd, KEY_C);
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
press(fd, KEY_ENTER);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (irc_status == IRCC_CONNECTED)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
|
||||
//Init uinput
|
||||
int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
|
||||
if (fd < 0)
|
||||
die("WTF! Were uinput? Try modprobe uinput");
|
||||
|
||||
ioctl(fd, UI_SET_EVBIT, EV_KEY);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_RIGHT);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_UP);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_DOWN);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_LEFT);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_ENTER);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_C);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_Z);
|
||||
ioctl(fd, UI_SET_KEYBIT, KEY_X);
|
||||
|
||||
struct uinput_setup usetup;
|
||||
memset(&usetup, 0, sizeof(usetup));
|
||||
|
||||
usetup.id.bustype = BUS_USB;
|
||||
usetup.id.vendor = 0x1234;
|
||||
usetup.id.product = 0x5678;
|
||||
strcpy(usetup.name, "IrcKeyboard");
|
||||
|
||||
ioctl(fd, UI_DEV_SETUP, &usetup);
|
||||
ioctl(fd, UI_DEV_CREATE);
|
||||
sleep(2);
|
||||
|
||||
//512 - size of raw buffer (max irc)
|
||||
IRCC_init(&client);
|
||||
int status = IRCC_connect(&client, HOST, PORT);
|
||||
if (status == IRCC_ERROR)
|
||||
die("Conn refused");
|
||||
|
||||
//Register
|
||||
IRCC_register(&client, NICK);
|
||||
|
||||
//Recv motd and join in channel
|
||||
recvinfo(fd);
|
||||
sleep(5);
|
||||
for (size_t i = 0; i < sizeof(channels) / sizeof(char *); i++) {
|
||||
if (channels[i] == NULL)
|
||||
break;
|
||||
|
||||
size_t join_size = strlen("JOIN \r\n") + strlen(channels[i]) + 1;
|
||||
char *tmp = malloc(join_size);
|
||||
if (tmp == NULL)
|
||||
die("malloc retured NULL");
|
||||
|
||||
snprintf(tmp, join_size, "JOIN %s\r\n", channels[i]);
|
||||
send(client.socket, tmp, join_size, 0);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
recvinfo(fd);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user