JAVA
Nuria garcía cobas
Enlace al repositorio: [Link]
Para empezar con el bot lo primero que hay que hacer es crear una cuenta en Google
Cloud Console y ahí crear un nuevo proyecto. En la sección de credenciales crearemos
un OAuth Client ID (nos descargamos el JSON generado) y un API Key.
Ahora abriremos un proyecto nuevo con Gradle en el Intellij y crearemos una carpeta
llamada Credentials dentro del proyecto, en esta carpeta pegaremos el archivo JSON
descargado anteriormente. En la pestaña de Gradle del proyecto implementamos las
dependencias de la API de drive y nos quedaria el codigo siguiente:
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'DriveQuickstart'
sourceCompatibility = 11
targetCompatibility = 11
version = '1.0'
repositories {
mavenCentral()
}
dependencies {
implementation '[Link]-client:google-api-client:1.33.0'
implementation '[Link]-client:google-oauth-client-
jetty:1.32.1'
implementation '[Link]:google-api-services-drive:v3-
rev20211107-1.32.1'
}
No olvidarse de implementar también la API de Discord.
Ahora creamos una Clase main llamada DriveQuickstart en la introduciremos el código
donde se cargan las credenciales de la API y del cliente.
En esta misma clase crearemos un método que devuelva una lista de archivos cuyo
nombre contenga una palabra introducida para buscar.
public static List<File> drive() throws GeneralSecurityException,
IOException {
// Build a new authorized API client service.
final NetHttpTransport HTTP_TRANSPORT =
[Link]();
Drive service = new [Link](HTTP_TRANSPORT, JSON_FACTORY,
getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
// Muestra los nombres e ID de 10 archivos
FileList result = [Link]().list()
//.setPageSize(10)
.setQ("name contains 'garfield'")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name)")
.execute();
List<File> files = [Link]();
if (files == null || [Link]()) {
[Link]("No files found.");
} else {
[Link]("Files:");
for (File file : files) {
[Link]("%s (%s)\n", [Link](), [Link]());
}
}
return files;
}
Ahora creamos otra clase para los métodos del bot de discord.
Implementamos los métodos de crearToken en la que se introduce el Token de discord
y este lo guarda en un fichero y el método leerFichero que lee el fichero con el token
creado, lo recoge y lo devuelve como un String.
Con estos dos métodos evitamos introducir el token cada vez que se ejecuta la
aplicación.
Implementamos ahora el método del bot que recibe el token y el array de archivos que
obtenemos del método de Drive. En este método autorizamos la conexión a discord y
creamos un embed que muestre la lista de archivos de drive del comando introducido
por el canal de discord.
public static void bot(String token, List<File> lista) {
final DiscordClient client = [Link](token);
final GatewayDiscordClient gateway = [Link]().block();
[Link]([Link]).subscribe(event -> {
final Message message = [Link]();
EmbedCreateSpec embed = [Link]()
.color([Link])
.image("attachment://[Link]")
.build();
if ("garfield".equals([Link]())) {
final MessageChannel channel = [Link]().block();
[Link] builder = [Link]();
//Array de archivos recibido de drive
for (File str : lista) {
[Link]([Link]());
[Link]([Link]()).block();
}
});
[Link]().block();
}
Esta es la salida al ejecutar la aplicación
Para finalizar en la clase DriveQuickstart implementamos un método que busque
una foto deseada en una carpeta específica de Drive. Para ello primero deberemos
crear nuestra carpeta en Drive e introducir las fotos deseadas. Una vez hecho este paso
con el método recorreremos las carpetas y los archivos para que cuando haya una
coincidencia de palabra la descargue en un archivo temporal.
// busco la imagen en el directorio
FileList resultImagenes = [Link]().list()
.setQ("name contains 'garfield' and parents in '"+ dirImagenes
+"'")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name)")
.execute();
List<File> filesImagenes = [Link]();
for (File file : filesImagenes) {
[Link]("Imagen: %s\n", [Link]());
// guardamos el 'stream' en el fichero [Link] tiene que existir
OutputStream outputStream = new
FileOutputStream("/home/dam1/Escritorio/[Link]");
[Link]().get([Link]())
.executeMediaAndDownloadTo(outputStream);
[Link]();
[Link]();
}
Por último en el método del bot de Discord recogemos la ruta donde está guardada la
imagen para buscar y mostramos la imagen en un embed.
if("!garfield".equals([Link]())) {
final MessageChannel channel = [Link]().block();
InputStream fileAsInputStream = null;
try {
fileAsInputStream = new
FileInputStream("/home/dam1/Escritorio/[Link]");
} catch (FileNotFoundException e) {
[Link]();
}
[Link]([Link]()
.content("content? content")
.addFile("[Link]", fileAsInputStream)
.addEmbed(embed)
.build()).subscribe();
}
});
[Link]().block();
}
Esta es la salida de la imagen al ejecutar el comando: