What's new

Bienvenido!

Al registrarse con nosotros, podrá discutir, compartir y enviar mensajes privados con otros miembros de nuestra comunidad.

Registrar cuenta Discord Nosetu Games

Juegos: Argentum Online Forever, Kicks Online 3, Narcs, Revival AO y más...

APORTE Discord Presence desde Visual Basic 6.

APORTE

Sun

Administrator
Admin
Joined
Sep 25, 2022
Messages
139
Este programa permite la integración de Discord Rich Presence en una aplicación desarrollada en Visual Basic 6 (VB6). Se encarga de enviar información sobre el estado del usuario al perfil de Discord, mostrando detalles en su estado de actividad, les estoy liberando la integración del tipico "Jugando X juego" en discord.


Code:
Option Explicit

' Github: https://github.com/KevinKorduner/
' Creado y liberado por Kevin Alexis Korduner 07/03/2025
' Este ejecutable hace el llamado a la DLL, deben configurar su app ID de discord.

' ==============================================================
' Declaraciones globales y de tipos
' ==============================================================

' Variables globales para almacenar los punteros a las cadenas ANSI.
Private g_statePtr As Long
Private g_detailsPtr As Long

' --------------------------------------------------------------
' Estructura para los callbacks (no se usan en este ejemplo)
' --------------------------------------------------------------
Private Type DiscordEventHandlers
    ready As Long           ' puntero a función (no se usa)
    disconnected As Long
    errored As Long
    joinGame As Long
    spectateGame As Long
    joinRequest As Long
End Type

' --------------------------------------------------------------
' Estructura adaptada de Discord Rich Presence
' (Los timestamps se dividen en dos Long: parte baja y parte alta)
' --------------------------------------------------------------
Private Type DiscordRichPresence
    state As Long             ' puntero (char*) a cadena ANSI
    details As Long           ' puntero (char*) a cadena ANSI
    startTimestampLow As Long ' parte baja del timestamp (int64)
    startTimestampHigh As Long ' parte alta del timestamp
    endTimestampLow As Long
    endTimestampHigh As Long
    largeImageKey As Long     ' puntero (char*) a cadena ANSI
    largeImageText As Long    ' puntero (char*) a cadena ANSI
    smallImageKey As Long     ' puntero (char*) a cadena ANSI
    smallImageText As Long    ' puntero (char*) a cadena ANSI
    partyId As Long           ' puntero (char*) a cadena ANSI
    partySize As Long         ' entero
    partyMax As Long          ' entero
    matchSecret As Long       ' puntero (char*) a cadena ANSI
    joinSecret As Long        ' puntero (char*) a cadena ANSI
    spectateSecret As Long    ' puntero (char*) a cadena ANSI
    instance As Long          ' entero
End Type

' --------------------------------------------------------------
' Declaración de funciones exportadas por discord-rpc.dll
' --------------------------------------------------------------
Private Declare Sub Discord_Initialize Lib "discord-rpc.dll" ( _
    ByVal applicationId As String, _
    ByRef handlers As DiscordEventHandlers, _
    ByVal autoRegister As Long, _
    ByVal optionalSteamId As String)

Private Declare Sub Discord_UpdatePresence Lib "discord-rpc.dll" ( _
    ByRef presence As DiscordRichPresence)

Private Declare Sub Discord_RunCallbacks Lib "discord-rpc.dll" ()
Private Declare Sub Discord_Shutdown Lib "discord-rpc.dll" ()

' --------------------------------------------------------------
' Declaraciones de funciones API para manejo de memoria
' --------------------------------------------------------------
Private Declare Function GlobalAlloc Lib "kernel32" ( _
    ByVal wFlags As Long, ByVal dwBytes As Long) As Long

Private Declare Function GlobalFree Lib "kernel32" ( _
    ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    Destination As Long, Source As Long, ByVal Length As Long)

Private Const GMEM_FIXED As Long = &H0

' --------------------------------------------------------------
' Función para asignar memoria y crear una cadena ANSI
' --------------------------------------------------------------
Public Function AllocAnsiString(s As String) As Long
    Dim byteArray() As Byte
    Dim lenBytes As Long
    Dim p As Long

    ' Convierte la cadena de Unicode a ANSI y añade el terminador nulo.
    byteArray = StrConv(s & vbNullChar, vbFromUnicode)
    lenBytes = UBound(byteArray) - LBound(byteArray) + 1

    p = GlobalAlloc(GMEM_FIXED, lenBytes)
    If p <> 0 Then
        CopyMemory p, VarPtr(byteArray(0)), lenBytes
    Else
        MsgBox "Error al asignar memoria para la cadena: " & s, vbCritical, "Error"
    End If
    AllocAnsiString = p
End Function

' --------------------------------------------------------------
' Procedimiento para liberar la memoria asignada
' --------------------------------------------------------------
Public Sub FreeAnsiString(p As Long)
    If p <> 0 Then GlobalFree p
End Sub

' ==============================================================
' Eventos del formulario
' ==============================================================

Private Sub Form_Load()
    ' Llamada a la subrutina de inicialización al cargar el formulario.
    Ta
End Sub

Private Sub Ta()
    On Error GoTo ErrHandler
    
    Dim sDllPath As String
    sDllPath = App.Path
    ' Asegurarse de que la ruta termine en "\"
    If Right$(sDllPath, 1) <> "\" Then
        sDllPath = sDllPath & "\"
    End If
    
    ' Comprueba que la DLL exista en el directorio de la aplicación.
    If Dir$(sDllPath & "discord-rpc.dll") = "" Then
        MsgBox "No se encontró discord-rpc.dll en " & sDllPath, vbCritical, "Error"
        Exit Sub
    End If
    
    Dim handlers As DiscordEventHandlers
    Dim presence As DiscordRichPresence
    Dim unixTime As Long
    
    Debug.Print "Inicializando Discord RPC..."
    
    ' Inicializa la estructura de callbacks a cero (no se usan en este ejemplo)
    handlers.ready = 0
    handlers.disconnected = 0
    handlers.errored = 0
    handlers.joinGame = 0
    handlers.spectateGame = 0
    handlers.joinRequest = 0

    ' Llama a Discord_Initialize con tu App ID.
    ' (La DLL debe gestionar el terminador nulo de la cadena)
    Discord_Initialize "5234441513530066311", handlers, 1, ""
    Debug.Print "Discord_Initialize ejecutado."
    
    ' Asigna memoria y prepara las cadenas ANSI para "state" y "details"
    g_statePtr = AllocAnsiString("Jugando AOForever")
    g_detailsPtr = AllocAnsiString("Jugando AOForever")
    If g_statePtr = 0 Or g_detailsPtr = 0 Then
        MsgBox "Error al asignar memoria para las cadenas ANSI.", vbCritical, "Error"
        Exit Sub
    End If
    
    presence.state = g_statePtr
    presence.details = g_detailsPtr
    
    ' Calcula el timestamp UNIX (segundos desde el 1/1/1970)
    unixTime = DateDiff("s", "1/1/1970 00:00:00", Now)
    presence.startTimestampLow = unixTime
    presence.startTimestampHigh = 0
    presence.endTimestampLow = 0
    presence.endTimestampHigh = 0
    
    ' Para este ejemplo no se usan imágenes, party, secretos ni instancia.
    presence.largeImageKey = 0
    presence.largeImageText = 0
    presence.smallImageKey = 0
    presence.smallImageText = 0
    presence.partyId = 0
    presence.partySize = 0
    presence.partyMax = 0
    presence.matchSecret = 0
    presence.joinSecret = 0
    presence.spectateSecret = 0
    presence.instance = 0
    
    ' Actualiza la presencia en Discord
    Discord_UpdatePresence presence
    Debug.Print "Discord_UpdatePresence ejecutado."
    
    ' Configura y activa el Timer para llamar a Discord_RunCallbacks cada segundo
    Timer1.Interval = 1000   ' 1000 ms = 1 segundo
    Timer1.Enabled = True
    
    ' Actualiza un Label para indicar que la aplicación está en ejecución.
    Label1.Caption = "Inicialización completa. La aplicación se encuentra en ejecución." & vbCrLf & _
                     "Cierre el formulario para salir y retirar el tag de Discord."
    Debug.Print "Inicialización completa."
    
    Exit Sub

ErrHandler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbCritical, "Error"
End Sub

Private Sub Timer1_Timer()
    On Error Resume Next
    ' Llama a los callbacks de Discord para mantener la conexión.
    Discord_RunCallbacks
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' Al cerrar el formulario: detiene el Timer, cierra la conexión y libera la memoria.
    Timer1.Enabled = False
    Discord_Shutdown
    FreeAnsiString g_statePtr
    FreeAnsiString g_detailsPtr
End Sub


Características Principales​

  • Inicializa la conexión con Discord Rich Presence a través de la librería discord-rpc.dll.
  • Actualiza el estado del usuario con un mensaje personalizado mientras juega.
  • Gestiona la memoria para enviar correctamente cadenas ANSI a la API de Discord.
  • Ejecuta un temporizador que mantiene activa la comunicación con Discord.
  • Cierra correctamente la conexión cuando el programa se cierra.



Requisitos​

  1. Discord debe estar instalado y en ejecución en el sistema.
  2. Visual Basic 6 para compilar y ejecutar el programa.
  3. La librería discord-rpc.dll debe estar en la misma carpeta que el ejecutable.



Configuración y Uso​

1. Configurar la App ID de Discord​


La aplicación requiere una App ID de Discord, que se obtiene creando una aplicación en el Discord Developer Portal.


En el código, la App ID está definida en la función Discord_Initialize:

Discord_Initialize "5121441513530066311", handlers, 1, ""


Debes remplazar "5121441513530066311" por la ID correspondiente a tu aplicación de Discord.


2. Ubicar discord-rpc.dll​


Asegúrate de que discord-rpc.dll esté en el mismo directorio que el ejecutable del programa. Si no está presente, el programa mostrará un mensaje de error y no podrá iniciarse.


3. Compilación y Ejecución​

  1. Abre Visual Basic 6 y carga el código.
  2. Asegúrate de que la referencia a discord-rpc.dll esté en la carpeta del proyecto.
  3. Ejecuta el código desde VB6 o compílalo en un ejecutable.
  4. Al iniciar la aplicación, si Discord está abierto, verás el estado "Jugando AOForever" en tu perfil de Discord. (Cambia el nombre del juego por el tuyo!)



Flujo del Programa​

  1. Carga del formulario (Form_Load)
    • Llama a Ta(), que inicia la conexión con Discord y configura el estado.
  2. Inicialización (Ta)
    • Verifica la presencia de discord-rpc.dll.
    • Llama a Discord_Initialize para conectar con Discord.
    • Asigna memoria para almacenar los textos de estado.
    • Llama a Discord_UpdatePresence para actualizar la actividad del usuario en Discord.
    • Inicia un temporizador (Timer1) que ejecuta Discord_RunCallbacks cada segundo para mantener la conexión activa.
  3. Mantenimiento (Timer1_Timer)
    • Ejecuta Discord_RunCallbacks para procesar los eventos de Discord y evitar desconexiones.
  4. Cierre del Programa (Form_Unload)
    • Detiene el temporizador y libera la memoria asignada.
    • Llama a Discord_Shutdown para cerrar la conexión con Discord.



Notas Importantes​

  • Si Discord no está abierto, la integración no funcionará.
  • Este ejemplo solo establece un estado básico en Discord.



Código completo:
https://github.com/KevinKorduner/
 

Jeromecah

New member
Joined
Apr 23, 2025
Messages
2
Компания автоюристов в Санкт-Петербурге оказывает услуги:

Обжалование незаконных решений МРЭО и ГИБДД СПб;

Возврат КБМ через суды Петербурга;

Защита интересов клиентов в спорах с таксопарками.
Архив успешных кейсов: 250+ дел за 2023-2024 гг.. https://avtoyuristvspb.ru/
 
Top