Domanda

Ho codificato un robino IRC Bot che è su GitHub (/ Ninjex / Rubot) che ha un po 'di uscita in conflitto con MySQL su un server dedicato che ho appena acquistato.

Prima di tutto, abbiamo la connessione al database nella cartella MySQL (in .gitignore) che sembra simile al seguente blocco di codice.

@con = Mysql.new('localhost', 'root', 'pword', 'db_name')
.

Quindi abbiamo una funzione effettiva per interrogare il database

def db_query
 que = get_message # Grabs query from user i.e,./db_query SELECT * FROM words
 results = @con.query(que) # Send query through the connection i.e, @con.query("SELECT * FROM WORDS")
 results.each {|x| chan_send(x)} # For each row returned, send it to the channel via
end
.

sulla mia macchina locale, quando si esegue il comando:

./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'

Ricevo l'output in IRC in un array come la moda: ["17", "Bob"] dove 17 è la quantità e Bob è l'utente.

Tuttavia, l'utilizzo della stessa funzione sul mio server dedicato si traduce in un output come: 17Bob Ho tentato molte modifiche nel codice, oltre a provare ad analizzare i dati nella propria variabile, tuttavia sembra che il 17Bob stia uscendo Come una singola variabile, rendendo impossibile analizzare in qualcosa come un array, che potrei quindi utilizzare per inviare i dati correttamente.

Questo mi sembra strano sia sulla mia macchina locale che sul server dedicato, come mi aspettavo che l'output di prima inviare 17 all'IRC e poi su Bob come:

17
Bob
.

Per tutte le funzioni e fonte è possibile controllare il mio GitHub / Ninjex / Rubot, tuttavia potrebbe essere necessario installare alcune gemme.

È stato utile?

Soluzione

Alcune note:

    .
  1. Assicurati di essere la query sanitizzante tramite get_message. Oppure ti stai aprendo a qualche serio problemi di sicurezza .
  2. Assicurati di utilizzare le stesse versioni del gemma mysql, rubino e mysql. Le differenze in una qualsiasi di queste potrebbero modificare l'uscita prevista.
  3. Se sei al tuo wits fine e non riesci a risolvere il problema sottostante, puoi sempre inviare un delimitatore personalizzato e usarlo per dividere. Sfortunatamente, supererà il caso che effettivamente funziona e dovrà essere spogliato.
  4. Ecco come avrei affrontato il debug del problema sulla macchina dedicata:

    def db_query
     que = get_sanitized_message
     results = @con.query(que)
     require 'pry'
     binding.pry
    
     results.each {|x| chan_send(x)}
    end
    
    .

      .
    1. Aggiungi il PRIME GEM al tuo gemfile o gem install pry.
    2. Aggiorna il tuo codice da utilizzare pry: Vedi sopra
    3. Questo aprirà una console di pry quando la linea binding.pry viene colpita e puoi interrogare quasi tutto nella tua applicazione in esecuzione.
    4. Darei un'occhiata a results e vedi se è un array. Basta digitare results nella console e stamperà il valore. Digitare anche results.class. È possibile che la query stia restituendo un oggetto set di risultati speciali che non è un array, ma che ha un metodo per accedere all'array dei risultati.
    5. Se results è un array, quindi il problema è più probabile in chan_send. Forse deve usare qualcosa come puts vs print per garantire che ci sia una nuova riga dopo ogni messaggio. È possibile che tu abbia diverse versioni del tuo CodiceBase distribuito? Aggiungerei anche un sleep 1 all'interno di ciascun blocco per garantire che questo non sia correlato alla tua gestione dei messaggi che arrivano allo stesso tempo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top