Загрузить файлы в «/»
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