Το Discord είναι μια πλατφόρμα ανταλλαγής μηνυμάτων σε πραγματικό χρόνο που χρεώνεται ως «συνομιλία φωνής και κειμένου all-in-one για παίκτες». Λόγω της λεπτής διεπαφής, της ευκολίας χρήσης και των εκτεταμένων δυνατοτήτων του, το Discord γνώρισε ραγδαία ανάπτυξη και γίνεται όλο και πιο δημοφιλές ακόμη και σε όσους έχουν μικρό ενδιαφέρον για βιντεοπαιχνίδια. Μεταξύ Μαΐου 2017 και Μαΐου 2018, η βάση χρηστών της εξερράγη από 45 εκατομμύρια χρήστες σε περισσότερους από 130 εκατομμύρια , με περισσότερους από δύο φορές περισσότερους χρήστες καθημερινά Χαλαρότητα .
Ένα από τα πιο ελκυστικά χαρακτηριστικά του Discord από το a προγραμματιστής του chatbot Η προοπτική είναι η ισχυρή υποστήριξή της για προγραμματιζόμενα bots που βοηθούν στην ενσωμάτωση του Discord με τον εξωτερικό κόσμο και παρέχουν στους χρήστες μια πιο ελκυστική εμπειρία. Τα bots είναι πανταχού παρόντα στο Discord και παρέχουν ένα ευρύ φάσμα υπηρεσιών, όπως βοήθεια εποπτείας, παιχνίδια, μουσική, αναζητήσεις στο Διαδίκτυο, επεξεργασία πληρωμών και άλλα.
Σε αυτό το σεμινάριο bot Discord, θα ξεκινήσουμε συζητώντας το περιβάλλον χρήστη Discord και τα API REST και WebSocket για bots πριν προχωρήσουμε σε ένα σεμινάριο όπου θα γράψουμε ένα απλό bot Discord σε JavaScript. Τέλος, θα ακούσουμε από τον προγραμματιστή, από ορισμένες μετρήσεις, το πιο δημοφιλές bot του Discord και τις εμπειρίες του σχετικά με την ανάπτυξη και τη συντήρηση της σημαντικής υποδομής και της βάσης κώδικα του.
Προτού συζητήσουμε τεχνικές λεπτομέρειες, είναι σημαντικό να κατανοήσουμε πώς ένας χρήστης αλληλεπιδρά με το Discord και πώς το Discord εμφανίζεται στους χρήστες. Ο τρόπος που παρουσιάζεται στα bots είναι εννοιολογικά παρόμοιος (αλλά φυσικά μη οπτικός). Στην πραγματικότητα, οι επίσημες εφαρμογές Discord βασίζονται στα ίδια API που χρησιμοποιούν τα bots. Είναι τεχνικά δυνατό να εκτελέσετε ένα bot μέσα σε έναν κανονικό λογαριασμό χρήστη με μικρή τροποποίηση, αλλά αυτό απαγορεύεται από τους όρους υπηρεσίας του Discord. Τα bots απαιτούνται για εκτέλεση σε λογαριασμούς bot.
Ακολουθεί μια ματιά στην έκδοση του προγράμματος περιήγησης ένας της εφαρμογής Discord που εκτελείται εντός του Chrome.
ένας Το Discord UI για την εφαρμογή επιτραπέζιου υπολογιστή είναι σχεδόν το ίδιο με την εφαρμογή ιστού, συσκευασμένη με Electron. Η εφαρμογή iOS έχει δημιουργηθεί με το React Native. Η εφαρμογή Android είναι εγγενής κωδικός Java Android.
Ας το σπάσουμε.
Στα αριστερά είναι η λίστα των διακομιστών στους οποίους είμαι μέλος. Εάν είστε εξοικειωμένοι με το Slack, ένας διακομιστής είναι ανάλογος με έναν χώρο εργασίας Slack και αντιπροσωπεύει μια ομάδα χρηστών που μπορούν να αλληλεπιδράσουν μεταξύ τους εντός ενός ή περισσότερων καναλιών στο διακομιστή. Η διαχείριση ενός διακομιστή γίνεται από τον δημιουργό του ή / και από το προσωπικό που επιλέγουν και επιλέγουν να αναθέσουν τις ευθύνες τους. Ο δημιουργός ή / και το προσωπικό καθορίζουν τους κανόνες, τη δομή των καναλιών στο διακομιστή και διαχειρίζονται τους χρήστες.
Στην περίπτωσή μου, το API Discord Ο διακομιστής βρίσκεται στην κορυφή της λίστας διακομιστών μου. Είναι ένα εξαιρετικό μέρος για να λάβετε βοήθεια και να μιλήσετε με άλλους προγραμματιστές. Παρακάτω είναι ένας διακομιστής που δημιούργησα Δοκιμή . Θα δοκιμάσουμε το bot που δημιουργούμε αργότερα εκεί. Παρακάτω είναι ένα κουμπί για τη δημιουργία ενός νέου διακομιστή. Ο καθένας μπορεί να δημιουργήσει έναν διακομιστή με λίγα κλικ.
Σημειώστε ότι ενώ ο όρος που χρησιμοποιείται στη διεπαφή χρήστη του Discord είναι Υπηρέτης , ο όρος που χρησιμοποιείται στην τεκμηρίωση προγραμματιστή και το API είναι Συντεχνία . Μόλις προχωρήσουμε στο να μιλάμε για τεχνικά θέματα, θα αλλάξουμε στο να μιλάμε για Συντεχνίες . Οι δύο όροι είναι εναλλάξιμοι.
Ακριβώς δεξιά από τη λίστα διακομιστών βρίσκεται η λίστα καναλιών για τον διακομιστή που βλέπω αυτήν τη στιγμή (σε αυτήν την περίπτωση, ο διακομιστής Discord API). Τα κανάλια μπορούν να χωριστούν σε έναν αυθαίρετο αριθμό κατηγοριών. Στον διακομιστή Discord API, οι κατηγορίες περιλαμβάνουν ΠΛΗΡΟΦΟΡΙΕΣ, ΓΕΝΙΚΑ και LIBS, όπως φαίνεται. Κάθε κανάλι λειτουργεί ως αίθουσα συνομιλίας όπου οι χρήστες μπορούν να συζητήσουν σε οποιοδήποτε θέμα είναι αφιερωμένο το κανάλι. Το κανάλι που βλέπουμε αυτήν τη στιγμή (πληροφορίες) έχει πιο ανοιχτό φόντο. Τα κανάλια που έχουν νέα μηνύματα από την τελευταία φορά που τα είδαμε έχουν χρώμα λευκού κειμένου.
Αυτή είναι η προβολή καναλιού όπου μπορούμε να δούμε τι μιλούν οι χρήστες στο κανάλι που παρακολουθούμε αυτήν τη στιγμή. Μπορούμε να δούμε ένα μήνυμα εδώ, μόνο εν μέρει ορατό. Πρόκειται για μια λίστα συνδέσμων προς διακομιστές υποστήριξης για μεμονωμένες βιβλιοθήκες bot Discord. Οι διαχειριστές διακομιστών έχουν διαμορφώσει αυτό το κανάλι έτσι ώστε οι κανονικοί χρήστες σαν εμένα να μην μπορούν να στέλνουν μηνύματα σε αυτό. Οι διαχειριστές χρησιμοποιούν αυτό το κανάλι ως πίνακας ανακοινώσεων για να δημοσιεύσουν μερικές σημαντικές πληροφορίες όπου μπορούν εύκολα να δουν και δεν θα πνιγούν από συνομιλία.
Πάνω στα δεξιά είναι μια λίστα των χρηστών που είναι συνδεδεμένοι αυτήν τη στιγμή σε αυτόν τον διακομιστή. Οι χρήστες είναι οργανωμένοι σε διαφορετικές κατηγορίες και τα ονόματά τους έχουν διαφορετικά χρώματα. Αυτό είναι αποτέλεσμα του ρόλοι που έχουν. Ένας ρόλος περιγράφει σε ποια κατηγορία (εάν υπάρχει) πρέπει να εμφανίζεται ο χρήστης, ποιο χρώμα πρέπει να είναι το όνομα και ποια δικαιώματα έχουν στον διακομιστή. Ένας χρήστης μπορεί να έχει περισσότερους από έναν ρόλους (και πολύ συχνά το κάνει), και υπάρχει κάποια μαθηματική προτεραιότητα που καθορίζει τι συμβαίνει σε αυτήν την περίπτωση. Τουλάχιστον, κάθε χρήστης έχει το ρόλο @everyone. Άλλοι ρόλοι δημιουργούνται και εκχωρούνται από το προσωπικό του διακομιστή.
javascript μετατροπή χρονικής σφραγίδας σε ημερομηνία
Αυτή είναι η εισαγωγή κειμένου όπου θα μπορούσα να πληκτρολογήσω και να στείλω μηνύματα, εάν μου επιτρέπεται. Εφόσον δεν έχω άδεια να στείλω μηνύματα σε αυτό το κανάλι, δεν μπορώ να πληκτρολογήσω εδώ.
Αυτός είναι ο τρέχων χρήστης. Έχω ορίσει το όνομα χρήστη μου σε 'Εγώ' για να με βοηθήσει να μην μπερδευτώ και επειδή είμαι φοβερός στην επιλογή ονομάτων. Κάτω από το όνομα χρήστη μου υπάρχει ένας αριθμός (# 9484) που είναι ο διακριτικός μου. Μπορεί να υπάρχουν πολλοί άλλοι χρήστες με το όνομα 'Εγώ', αλλά είμαι ο μόνος 'Εγώ # 9484'. Είναι επίσης δυνατό για μένα να ορίσω ένα ψευδώνυμο για μένα ανά διακομιστή, ώστε να μπορώ να είμαι γνωστός με διαφορετικά ονόματα σε διαφορετικούς διακομιστές.
Αυτά είναι τα βασικά μέρη της διεπαφής χρήστη Discord, αλλά υπάρχουν και πολλά περισσότερα. Είναι εύκολο να ξεκινήσετε να χρησιμοποιείτε το Discord ακόμη και χωρίς να δημιουργήσετε λογαριασμό, οπότε μη διστάσετε να αφιερώσετε ένα λεπτό για να το κάνετε. Μπορείτε να εισάγετε Discord μεταβαίνοντας την αρχική σελίδα Discord , κάνοντας κλικ στο 'Άνοιγμα Discord σε ένα πρόγραμμα περιήγησης', επιλέγοντας ένα όνομα χρήστη και πιθανώς παίζοντας έναν αναζωογονητικό γύρο ή δύο 'κάντε κλικ στις εικόνες του λεωφορείου'.
Το Discord API αποτελείται από δύο ξεχωριστά κομμάτια: το WebSocket και το REST API. Σε γενικές γραμμές, το WebSocket API χρησιμοποιείται για τη λήψη συμβάντων από το Discord σε πραγματικό χρόνο, ενώ το REST API χρησιμοποιείται για την εκτέλεση ενεργειών εντός του Discord.
Το WebSocket API χρησιμοποιείται για τη λήψη συμβάντων από το Discord, όπως δημιουργία μηνυμάτων, διαγραφή μηνυμάτων, συμβάντα kick / ban χρήστη, ενημερώσεις δικαιωμάτων χρήστη και πολλά άλλα. Η επικοινωνία από ένα bot στο WebSocket API από την άλλη πλευρά είναι πιο περιορισμένη. Ένα bot χρησιμοποιεί το WebSocket API για να ζητήσει μια σύνδεση, να αναγνωριστεί, να χτυπήσει τον καρδιακό παλμό, να διαχειριστεί φωνητικές συνδέσεις και να κάνει μερικά ακόμη βασικά πράγματα. Μπορείτε να διαβάσετε περισσότερες λεπτομέρειες στο Discord's τεκμηρίωση πύλης (μία σύνδεση στο WebSocket API αναφέρεται ως πύλη). Για την εκτέλεση άλλων ενεργειών, χρησιμοποιείται το REST API.
Τα συμβάντα από το WebSocket API περιέχουν ωφέλιμο φορτίο, συμπεριλαμβανομένων πληροφοριών που εξαρτώνται από τον τύπο του συμβάντος. Για παράδειγμα, όλα Δημιουργία μηνύματος τα συμβάντα θα συνοδεύονται από ένα αντικείμενο χρήστη που αντιπροσωπεύει τον συντάκτη του μηνύματος. Ωστόσο, μόνο το αντικείμενο χρήστη δεν περιέχει όλες τις πληροφορίες που πρέπει να γνωρίζετε για τον χρήστη. Για παράδειγμα, δεν περιλαμβάνονται πληροφορίες σχετικά με τα δικαιώματα του χρήστη. Εάν χρειάζεστε περισσότερες πληροφορίες, θα μπορούσατε να ρωτήσετε το REST API για αυτό, αλλά για λόγους που εξηγούνται περαιτέρω στην επόμενη ενότητα, θα πρέπει γενικά να έχετε πρόσβαση στην προσωρινή μνήμη που θα έπρεπε να έχετε δημιουργήσει από ωφέλιμα φορτία που έχουν ληφθεί από προηγούμενα συμβάντα. Υπάρχουν ορισμένα συμβάντα που παρέχουν ωφέλιμα φορτία που σχετίζονται με τα δικαιώματα ενός χρήστη, συμπεριλαμβανομένων, αλλά δεν περιορίζονται σε αυτά Δημιουργία συντεχνίας , Ενημέρωση ρόλου συντεχνίας , και Ενημέρωση καναλιού .
Ένα bot μπορεί να υπάρχει σε 2.500 τάγματα το πολύ ανά σύνδεση στο WebSocket. Προκειμένου να επιτρέψει σε ένα bot να υπάρχει σε περισσότερες ομάδες, το bot πρέπει να εφαρμόσει θραύση και να ανοίξει πολλές ξεχωριστές συνδέσεις WebSocket στο Discord. Εάν το bot σας τρέχει μέσα σε μια μεμονωμένη διαδικασία σε έναν κόμβο, αυτό είναι μόνο μια πρόσθετη πολυπλοκότητα για εσάς που μπορεί να φαίνεται περιττή. Αλλά αν το bot σας είναι πολύ δημοφιλές και πρέπει να έχει το back-end του διανεμημένο σε ξεχωριστούς κόμβους, η υποστήριξη θραύσης του Discord το καθιστά πολύ πιο εύκολο από ότι θα ήταν διαφορετικά.
Το Discord REST API χρησιμοποιείται από bots για την εκτέλεση περισσότερων ενεργειών, όπως αποστολή μηνυμάτων, κλοτσιές / απαγόρευση χρηστών και ενημέρωση δικαιωμάτων χρήστη (σε γενικές γραμμές ανάλογες με τις εκδηλώσεις που λαμβάνονται από το WebSocket API). Το REST API μπορεί επίσης να χρησιμοποιηθεί για την αναζήτηση πληροφοριών. Ωστόσο, τα bots βασίζονται κυρίως σε συμβάντα από το API του WebSocket και αποθηκεύουν προσωρινά τις πληροφορίες που λαμβάνονται από τα συμβάντα του WebSocket.
Υπάρχουν διάφοροι λόγοι για αυτό. Ερώτημα του REST API για λήψη πληροφοριών χρήστη κάθε φορά Δημιουργία μηνύματος το συμβάν που λαμβάνεται, για παράδειγμα, δεν κλιμακώνεται λόγω των ορίων τιμών του REST API. Είναι επίσης περιττή στις περισσότερες περιπτώσεις, καθώς το WebSocket API παρέχει τις απαραίτητες πληροφορίες και θα πρέπει να τις έχετε στην κρυφή μνήμη.
Υπάρχουν, ωστόσο, ορισμένες εξαιρέσεις και μερικές φορές ενδέχεται να χρειαστείτε πληροφορίες που δεν υπάρχουν στην προσωρινή μνήμη σας. Όταν ένα bot συνδέεται αρχικά με μια πύλη WebSocket, a Ετοιμος εκδήλωση και ένα Δημιουργία συντεχνίας συμβάν ανά τάγμα στο οποίο υπάρχει το bot σε αυτό το θραύσμα αποστέλλονται αρχικά στο bot έτσι ώστε να μπορεί να συμπληρώσει την προσωρινή μνήμη του με την τρέχουσα κατάσταση. ο Δημιουργία συντεχνίας Οι εκδηλώσεις για πυκνοκατοικημένες τάξεις περιλαμβάνουν μόνο πληροφορίες σχετικά με τους διαδικτυακούς χρήστες. Εάν το bot σας χρειάζεται να λάβει πληροφορίες σχετικά με έναν χρήστη εκτός σύνδεσης, οι σχετικές πληροφορίες ενδέχεται να μην υπάρχουν στην προσωρινή μνήμη σας. Σε αυτήν την περίπτωση, είναι λογικό να υποβάλετε αίτημα στο REST API. Εναλλακτικά, εάν συχνά χρειάζεστε πληροφορίες σχετικά με χρήστες εκτός σύνδεσης, μπορείτε να επιλέξετε να στείλετε ένα Ζητήστε μέλη Guild opcode στο WebSocket API για να ζητήσετε μέλη της συντεχνίας εκτός σύνδεσης.
Μια άλλη εξαίρεση είναι εάν η εφαρμογή σας δεν είναι καθόλου συνδεδεμένη στο WebSocket API. Για παράδειγμα, εάν το bot σας διαθέτει πίνακα ελέγχου ιστού στον οποίο οι χρήστες μπορούν να συνδεθούν και να αλλάξουν τις ρυθμίσεις του bot στο διακομιστή τους. Ο πίνακας ελέγχου ιστού θα μπορούσε να εκτελείται σε ξεχωριστή διαδικασία χωρίς συνδέσεις με το WebSocket API και χωρίς προσωρινή μνήμη δεδομένων από το Discord. Ίσως χρειαστεί να υποβάλλετε περιστασιακά λίγα αιτήματα REST API. Σε αυτό το είδος σεναρίου, είναι λογικό να βασίζεστε στο REST API για να λάβετε τις πληροφορίες που χρειάζεστε.
Παρόλο που είναι πάντα καλή ιδέα να έχετε κάποια κατανόηση για κάθε επίπεδο της στοίβας τεχνολογίας σας, η χρήση των Discord WebSocket και REST APIs είναι χρονοβόρα, επιρρεπής σε σφάλματα, γενικά περιττή και στην πραγματικότητα επικίνδυνη.
Το Discord παρέχει ένα επιμελημένη λίστα με επίσημα ελεγμένες βιβλιοθήκες και προειδοποιεί ότι:
Η χρήση προσαρμοσμένων εφαρμογών ή μη συμμορφούμενων βιβλιοθηκών που κάνουν κατάχρηση του API ή προκαλούν υπερβολικά όρια τιμών μπορεί να οδηγήσει σε μόνιμη απαγόρευση.
Οι βιβλιοθήκες που ελέγχονται επίσημα από το Discord είναι γενικά ώριμες, καλά τεκμηριωμένες και διαθέτουν πλήρη κάλυψη του Discord API. Οι περισσότεροι προγραμματιστές bot δεν θα έχουν ποτέ καλό λόγο να αναπτύξουν μια προσαρμοσμένη εφαρμογή, εκτός από περιέργεια ή γενναιότητα!
Αυτή τη στιγμή, οι επίσημα ελεγμένες βιβλιοθήκες περιλαμβάνουν υλοποιήσεις για Crystal, C #, D, Go, Java, JavaScript, Lua, Nim, PHP, Python, Ruby, Rust και Swift. Μπορεί να υπάρχουν δύο ή περισσότερες διαφορετικές βιβλιοθήκες για τη γλώσσα επιλογής σας. Η επιλογή ποιας χρήσης μπορεί να είναι μια δύσκολη απόφαση. Εκτός από τον έλεγχο της αντίστοιχης τεκμηρίωσης, ίσως θελήσετε να εγγραφείτε στο ανεπίσημος διακομιστής Discord API και πάρτε μια αίσθηση για το είδος της κοινότητας που βρίσκεται πίσω από κάθε βιβλιοθήκη.
Ας ξεκινήσουμε δουλειά. Θα δημιουργήσουμε ένα bot Discord που κρέμεται στον διακομιστή μας και ακούει για webhooks Κο-Φι . Το Ko-fi είναι μια υπηρεσία που σας επιτρέπει να δέχεστε εύκολα δωρεές στον λογαριασμό σας στο PayPal. Είναι πολύ απλό να δημιουργήσετε webhooks εκεί, σε αντίθεση με το PayPal όπου πρέπει να έχετε επαγγελματικό λογαριασμό, επομένως είναι ιδανικό για σκοπούς επίδειξης ή για επεξεργασία δωρεών μικρής κλίμακας.
Όταν ένας χρήστης δωρίζει 10 $ ή περισσότερα, το bot θα τους εκχωρήσει ένα Premium Member
ρόλος που αλλάζει το χρώμα του ονόματός τους και τους μετακινεί στην κορυφή της λίστας χρηστών στο διαδίκτυο. Για αυτό το έργο, θα χρησιμοποιήσουμε το Node.js και μια βιβλιοθήκη Discord API που ονομάζεται Eris (σύνδεσμος τεκμηρίωσης: https://abal.moe/Eris/). Η Eris δεν είναι η μόνη βιβλιοθήκη JavaScript. Μπορείτε να επιλέξετε το discord.js. Ο κώδικας που θα γράψουμε θα ήταν πολύ παρόμοιος με κάθε τρόπο.
Εκτός αυτού, ο Patreon, ένας άλλος επεξεργαστής δωρεών, παρέχει ένα επίσημο bot Discord και υποστηρίζει τη διαμόρφωση ρόλων Discord ως οφέλη συνεισφέροντος. Θα εφαρμόσουμε κάτι παρόμοιο, αλλά φυσικά πιο βασικό.
Ο κωδικός για κάθε βήμα του σεμιναρίου είναι διαθέσιμος στο GitHub ( https://github.com/mistval/premium_bot ). Μερικά από τα βήματα που εμφανίζονται σε αυτήν την ανάρτηση παραλείπουν αμετάβλητο κώδικα για συντομία, οπότε ακολουθήστε τους παρεχόμενους συνδέσμους στο GitHub εάν νομίζετε ότι μπορεί να σας λείπει κάτι.
πώς να χρησιμοποιήσετε το power pivot
Προτού ξεκινήσουμε τη σύνταξη κώδικα, χρειαζόμαστε λογαριασμό bot. Προτού μπορέσουμε να δημιουργήσουμε έναν λογαριασμό bot, χρειαζόμαστε έναν λογαριασμό χρήστη. Για να δημιουργήσετε έναν λογαριασμό χρήστη, ακολουθήστε τις οδηγίες εδώ .
Στη συνέχεια, για να δημιουργήσουμε έναν λογαριασμό bot, εμείς:
1) Δημιουργήστε μια εφαρμογή στο πύλη προγραμματιστή .
2) Συμπληρώστε μερικές βασικές λεπτομέρειες σχετικά με την εφαρμογή (σημειώστε το αναγνωριστικό ΠΕΛΑΤΗ που εμφανίζεται εδώ - θα το χρειαζόμαστε αργότερα).
3) Προσθέστε έναν χρήστη bot συνδεδεμένο στην εφαρμογή.
4) Απενεργοποιήστε τον διακόπτη PUBLIC BOT και σημειώστε το διακριτικό bot που εμφανίζεται (θα το χρειαστεί και αργότερα). Εάν διαρρεύσετε ποτέ το διακριτικό bot σας, για παράδειγμα δημοσιεύοντάς το σε μια εικόνα σε μια ανάρτηση του ApeeScape Blog, είναι επιτακτική ανάγκη να το αναδημιουργήσετε αμέσως. Όποιος διαθέτει το διακριτικό bot σας μπορεί να ελέγξει τον λογαριασμό του bot σας και να προκαλέσει δυνητικά σοβαρό και μόνιμο πρόβλημα για εσάς και τους χρήστες σας.
5) Προσθέστε το bot στη δοκιμαστική τάξη σας. Για να προσθέσετε ένα bot σε μια συντεχνία, αντικαταστήστε το αναγνωριστικό πελάτη του (εμφανίζεται νωρίτερα) στο ακόλουθο URI και μεταβείτε σε αυτό σε ένα πρόγραμμα περιήγησης.
https://discordapp.com/api/oauth2/authorize?scope=bot&client_id=XXX
Αφού κάνατε κλικ στην επιλογή εξουσιοδότησης, το bot βρίσκεται πλέον στη δοκιμαστική μου ομάδα και μπορώ να το δω στη λίστα χρηστών. Είναι εκτός σύνδεσης, αλλά θα το επιδιορθώσουμε σύντομα.
Υποθέτοντας ότι έχετε Node.js εγκατεστημένο, δημιουργήστε ένα έργο και εγκαταστήστε το Eris (τη βιβλιοθήκη bot που θα χρησιμοποιήσουμε), το Express (ένα πλαίσιο εφαρμογής ιστού που θα χρησιμοποιούμε για τη δημιουργία ενός ακροατή webhook) και το body-parser (για την ανάλυση σωμάτων webhook).
mkdir premium_bot cd premium_bot npm init npm install eris express body-parser
Ας ξεκινήσουμε με παιδικά βήματα. Πρώτα θα βάλουμε το bot online και θα μας απαντήσει. Μπορούμε να το κάνουμε αυτό σε 10-20 γραμμές κώδικα. Μέσα από ένα νέο αρχείο bot.js, πρέπει να δημιουργήσουμε μια παρουσία Eris Client, να το μεταβιβάσουμε το διακριτικό bot (αποκτήθηκε όταν δημιουργήσαμε μια εφαρμογή bot παραπάνω), να εγγραφείτε σε κάποια συμβάντα στην παρουσία πελάτη και να το πείτε να συνδεθεί στο Discord . Για λόγους επίδειξης, θα κωδικοποιήσουμε το διακριτικό bot στο αρχείο bot.js, αλλά η δημιουργία ενός ξεχωριστού αρχείου ρυθμίσεων και η εξαίρεσή του από τον έλεγχο προέλευσης είναι καλή πρακτική.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step1.js )
const eris = require('eris'); // Create a Client instance with our bot token. const bot = new eris.Client('my_token'); // When the bot is connected and ready, log to console. bot.on('ready', () => { console.log('Connected and ready.'); }); // Every time a message is sent anywhere the bot is present, // this event will fire and we will check if the bot was mentioned. // If it was, the bot will attempt to respond with 'Present'. bot.on('messageCreate', async (msg) => { const botWasMentioned = msg.mentions.find( mentionedUser => mentionedUser.id === bot.user.id, ); if (botWasMentioned) { try { await msg.channel.createMessage('Present'); } catch (err) { // There are various reasons why sending a message may fail. // The API might time out or choke and return a 5xx status, // or the bot may not have permission to send the // message (403 status). console.warn('Failed to respond to mention.'); console.warn(err); } } }); bot.on('error', err => { console.warn(err); }); bot.connect();
Εάν όλα πάνε καλά, όταν εκτελείτε αυτόν τον κωδικό με το δικό σας διακριτικό bot, Connected and ready.
θα εκτυπωθεί στην κονσόλα και θα δείτε το bot σας να είναι συνδεδεμένο στο διακομιστή δοκιμών σας. Μπορείτε να αναφέρετε2το bot σας είτε κάνοντας δεξί κλικ και επιλέγοντας 'Αναφορά' είτε πληκτρολογώντας το όνομά του που προηγείται του @. Το bot πρέπει να απαντήσει λέγοντας 'Παρόν'.
2 Η αναφορά είναι ένας τρόπος για να τραβήξετε την προσοχή ενός άλλου χρήστη, ακόμη και αν δεν είναι παρόντες. Ένας τακτικός χρήστης, όταν αναφέρεται, θα ειδοποιείται μέσω ειδοποίησης για επιτραπέζιο υπολογιστή, ειδοποίησης push για κινητά ή / και λίγο κόκκινο εικονίδιο που εμφανίζεται πάνω από το εικονίδιο Discord στο δίσκο συστήματος. Ο τρόπος (οι) ειδοποίησης ενός χρήστη εξαρτάται από τις ρυθμίσεις και την κατάσταση του διαδικτύου του. Τα bots, από την άλλη πλευρά, δεν λαμβάνουν καμία ειδική ειδοποίηση όταν αναφέρονται. Λαμβάνουν ένα κανονικό συμβάν δημιουργίας μηνυμάτων όπως κάνουν για οποιοδήποτε άλλο μήνυμα και μπορούν να ελέγξουν τις αναφορές που επισυνάπτονται στο συμβάν για να προσδιορίσουν εάν αναφέρονται.
Τώρα που γνωρίζουμε ότι μπορούμε να κάνουμε ένα bot online, ας απαλλαγούμε από το τρέχον Δημιουργία μηνύματος χειριστής συμβάντων και δημιουργία ενός νέου που μας επιτρέπει να ενημερώσουμε το bot ότι έχουμε λάβει πληρωμή από έναν χρήστη.
Για να ενημερώσουμε το bot πληρωμής, θα εκδώσουμε μια εντολή που μοιάζει με αυτήν:
pb!addpayment @user_mention payment_amount
Για παράδειγμα, pb!addpayment @Me 10.00
για να καταγράψετε μια πληρωμή 10,00 $ που πραγματοποίησα από εμένα.
ο pb! μέρος αναφέρεται ως πρόθεμα εντολών. Είναι καλή σύμβαση να επιλέξετε ένα πρόθεμα με το οποίο πρέπει να ξεκινούν όλες οι εντολές στο bot σας. Αυτό δημιουργεί μια μέτρηση του χώρου ονομάτων για bots και βοηθά στην αποφυγή σύγκρουσης με άλλα bots. Τα περισσότερα bots περιλαμβάνουν μια εντολή βοήθειας, αλλά φανταστείτε το χάος αν είχατε δέκα bots στο guild σας και απάντησαν όλοι βοήθεια ! Χρησιμοποιώντας το pb! ως πρόθεμα δεν είναι μια απίστευτη λύση, καθώς μπορεί να υπάρχουν και άλλα bots που χρησιμοποιούν επίσης το ίδιο πρόθεμα. Τα πιο δημοφιλή ρομπότ επιτρέπουν το πρόθεμά τους να διαμορφωθεί ανά βάση για να αποτρέψει τη σύγκρουση. Μια άλλη επιλογή είναι να χρησιμοποιήσετε την αναφορά του bot ως πρόθεμά του, αν και αυτό καθιστά την έκδοση εντολών πιο ρητή.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step2.js )
const eris = require('eris'); const PREFIX = 'pb!'; const bot = new eris.Client('my_token'); const commandHandlerForCommandName = {}; commandHandlerForCommandName['addpayment'] = (msg, args) => { const mention = args[0]; const amount = parseFloat(args[1]); // TODO: Handle invalid command arguments, such as: // 1. No mention or invalid mention. // 2. No amount or invalid amount. return msg.channel.createMessage(`${mention} paid $${amount.toFixed(2)}`); }; bot.on('messageCreate', async (msg) => { const content = msg.content; // Ignore any messages sent as direct messages. // The bot will only accept commands issued in // a guild. if (!msg.channel.guild) { return; } // Ignore any message that doesn't start with the correct prefix. if (!content.startsWith(PREFIX)) { return; } // Extract the parts of the command and the command name const parts = content.split(' ').map(s => s.trim()).filter(s => s); const commandName = parts[0].substr(PREFIX.length); // Get the appropriate handler for the command, if there is one. const commandHandler = commandHandlerForCommandName[commandName]; if (!commandHandler) { return; } // Separate the command arguments from the command prefix and command name. const args = parts.slice(1); try { // Execute the command. await commandHandler(msg, args); } catch (err) { console.warn('Error handling command'); console.warn(err); } }); bot.on('error', err => { console.warn(err); }); bot.connect();
Ας το προσπαθήσουμε.
Όχι μόνο λάβαμε το bot να ανταποκριθεί στο pb!addpayment
εντολή, αλλά δημιουργήσαμε ένα γενικευμένο μοτίβο για το χειρισμό εντολών. Μπορούμε να προσθέσουμε περισσότερες εντολές προσθέτοντας περισσότερους χειριστές στο commandHandlerForCommandName
λεξικό. Έχουμε τα χαρακτηριστικά ενός απλού πλαισίου εντολών εδώ. Ο χειρισμός των εντολών είναι ένα τόσο θεμελιώδες μέρος της δημιουργίας ενός bot που πολλοί άνθρωποι έχουν γράψει και ανοιχτά πηγές εντολών που θα μπορούσατε να χρησιμοποιήσετε αντί να γράψετε το δικό σας. Τα πλαίσια εντολών συχνά σας επιτρέπουν να καθορίσετε cooldowns, απαιτούμενα δικαιώματα χρήστη, ψευδώνυμα εντολών, περιγραφές εντολών και παραδείγματα χρήσης (για μια εντολή βοήθειας που δημιουργείται αυτόματα) και πολλά άλλα. Η Eris έρχεται με ένα ενσωματωμένο πλαίσιο εντολών .
Μιλώντας για τα δικαιώματα, το bot μας έχει λίγο πρόβλημα ασφαλείας. Οποιοσδήποτε μπορεί να εκτελέσει το addpayment
εντολή. Ας το περιορίσουμε έτσι ώστε μόνο ο κάτοχος του bot να μπορεί να το χρησιμοποιήσει. Θα αναδιαμορφώσουμε το commandHandlerForCommandName
λεξικό και να περιέχει αντικείμενα JavaScript ως τιμές. Αυτά τα αντικείμενα θα περιέχουν ένα execute
ιδιότητα με χειριστή εντολών και a botOwnerOnly
ιδιότητα με δυαδική τιμή. Θα κωδικοποιήσουμε επίσης το αναγνωριστικό χρήστη στην ενότητα σταθερών του bot, ώστε να γνωρίζει ποιος είναι ο ιδιοκτήτης του. Μπορείτε να βρείτε το αναγνωριστικό χρήστη ενεργοποιώντας τη λειτουργία προγραμματιστή στις ρυθμίσεις Discord και, στη συνέχεια, κάνοντας δεξί κλικ στο όνομα χρήστη σας και επιλέγοντας Αντιγραφή αναγνωριστικού.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step3.js )
const eris = require('eris'); const PREFIX = 'pb!'; const BOT_OWNER_ID = '123456789'; const bot = new eris.Client('my_token'); const commandForName = {}; commandForName['addpayment'] = { botOwnerOnly: true, execute: (msg, args) => { const mention = args[0]; const amount = parseFloat(args[1]); // TODO: Handle invalid command arguments, such as: // 1. No mention or invalid mention. // 2. No amount or invalid amount. return msg.channel.createMessage(`${mention} paid $${amount.toFixed(2)}`); }, }; bot.on('messageCreate', async (msg) => { try { const content = msg.content; // Ignore any messages sent as direct messages. // The bot will only accept commands issued in // a guild. if (!msg.channel.guild) { return; } // Ignore any message that doesn't start with the correct prefix. if (!content.startsWith(PREFIX)) { return; } // Extract the parts and name of the command const parts = content.split(' ').map(s => s.trim()).filter(s => s); const commandName = parts[0].substr(PREFIX.length); // Get the requested command, if there is one. const command = commandForName[commandName]; if (!command) { return; } // If this command is only for the bot owner, refuse // to execute it for any other user. const authorIsBotOwner = msg.author.id === BOT_OWNER_ID; if (command.botOwnerOnly && !authorIsBotOwner) { return await msg.channel.createMessage('Hey, only my owner can issue that command!'); } // Separate the command arguments from the command prefix and name. const args = parts.slice(1); // Execute the command. await command.execute(msg, args); } catch (err) { console.warn('Error handling message create event'); console.warn(err); } }); bot.on('error', err => { console.warn(err); }); bot.connect();
Τώρα το bot θα αρνείται θυμωμένα να εκτελέσει το addpayment
εντολή εάν κάποιος άλλος από τον κάτοχο του bot προσπαθεί να το εκτελέσει.
Στη συνέχεια ας κάνουμε το bot να ορίσει ένα Premium Member
ρόλο σε οποιονδήποτε δωρίζει δέκα δολάρια ή περισσότερα. Στο επάνω μέρος του αρχείου bot.js:
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step4.js )
const eris = require('eris'); const PREFIX = 'pb!'; const BOT_OWNER_ID = '523407722880827415'; const PREMIUM_CUTOFF = 10; const bot = new eris.Client('my_token'); const premiumRole = { name: 'Premium Member', color: 0x6aa84f, hoist: true, // Show users with this role in their own section of the member list. }; async function updateMemberRoleForDonation(guild, member, donationAmount) { // If the user donated more than , give them the premium role. if (guild && member && donationAmount >= PREMIUM_CUTOFF) { // Get the role, or if it doesn't exist, create it. let role = Array.from(guild.roles.values()) .find(role => role.name === premiumRole.name); if (!role) { role = await guild.createRole(premiumRole); } // Add the role to the user, along with an explanation // for the guild log (the 'audit log'). return member.addRole(role.id, 'Donated or more.'); } } const commandForName = {}; commandForName['addpayment'] = { botOwnerOnly: true, execute: (msg, args) => { const mention = args[0]; const amount = parseFloat(args[1]); const guild = msg.channel.guild; const userId = mention.replace(//, (match, group1) => group1); const member = guild.members.get(userId); // TODO: Handle invalid command arguments, such as: // 1. No mention or invalid mention. // 2. No amount or invalid amount. return Promise.all([ msg.channel.createMessage(`${mention} paid $${amount.toFixed(2)}`), updateMemberRoleForDonation(guild, member, amount), ]); }, };
Τώρα μπορώ να δοκιμάσω να λέω pb!addpayment @Me 10.00
και το bot πρέπει να μου αναθέσει το Premium Member
ρόλος.
Ωχ, εμφανίζεται ένα σφάλμα λείπουν δικαιώματα στην κονσόλα.
DiscordRESTError: DiscordRESTError [50013]: Missing Permissions index.js:85 code:50013
Το bot δεν έχει άδεια διαχείρισης ρόλων στη συντεχνία δοκιμής, επομένως δεν μπορεί να δημιουργήσει ή να εκχωρήσει ρόλους. Θα μπορούσαμε να δώσουμε στο bot προνόμιο διαχειριστή και δεν θα είχαμε ποτέ ξανά τέτοιου είδους προβλήματα, αλλά όπως και με οποιοδήποτε σύστημα, είναι καλύτερο να δώσουμε μόνο σε έναν χρήστη (ή σε αυτήν την περίπτωση ένα bot) τα ελάχιστα δικαιώματα που απαιτούν
Μπορούμε να δώσουμε στο bot την άδεια Διαχείριση ρόλων δημιουργώντας έναν ρόλο στις ρυθμίσεις διακομιστή, ενεργοποιώντας το δικαίωμα διαχείρισης ρόλων για αυτόν τον ρόλο και εκχωρώντας τον ρόλο στο bot.
Τώρα, όταν προσπαθώ να εκτελέσω ξανά την εντολή, ο ρόλος δημιουργείται και μου ανατίθεται και έχω ένα φανταχτερό χρώμα ονόματος και μια ειδική θέση στη λίστα μελών.
Στο χειριστή εντολών, έχουμε ένα σχόλιο TODO που υποδηλώνει ότι πρέπει να ελέγξουμε για μη έγκυρα ορίσματα. Ας το φροντίσουμε τώρα.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step5.js )
const commandForName = {}; commandForName['addpayment'] = { botOwnerOnly: true, execute: (msg, args) => { const mention = args[0]; const amount = parseFloat(args[1]); const guild = msg.channel.guild; const userId = mention.replace(//, (match, group1) => group1); const member = guild.members.get(userId); const userIsInGuild = !!member; if (!userIsInGuild) { return msg.channel.createMessage('User not found in this guild.'); } const amountIsValid = amount && !Number.isNaN(amount); if (!amountIsValid) { return msg.channel.createMessage('Invalid donation amount'); } return Promise.all([ msg.channel.createMessage(`${mention} paid $${amount.toFixed(2)}`), updateMemberRoleForDonation(guild, member, amount), ]); }, };
Εδώ είναι ο πλήρης κωδικός μέχρι στιγμής:
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step5.js )
const eris = require('eris'); const PREFIX = 'pb!'; const BOT_OWNER_ID = '123456789'; const PREMIUM_CUTOFF = 10; const bot = new eris.Client('my_token'); const premiumRole = { name: 'Premium Member', color: 0x6aa84f, hoist: true, // Show users with this role in their own section of the member list. }; async function updateMemberRoleForDonation(guild, member, donationAmount) { // If the user donated more than , give them the premium role. if (guild && member && donationAmount >= PREMIUM_CUTOFF) { // Get the role, or if it doesn't exist, create it. let role = Array.from(guild.roles.values()) .find(role => role.name === premiumRole.name); if (!role) { role = await guild.createRole(premiumRole); } // Add the role to the user, along with an explanation // for the guild log (the 'audit log'). return member.addRole(role.id, 'Donated or more.'); } } const commandForName = {}; commandForName['addpayment'] = { botOwnerOnly: true, execute: (msg, args) => { const mention = args[0]; const amount = parseFloat(args[1]); const guild = msg.channel.guild; const userId = mention.replace(//, (match, group1) => group1); const member = guild.members.get(userId); const userIsInGuild = !!member; if (!userIsInGuild) { return msg.channel.createMessage('User not found in this guild.'); } const amountIsValid = amount && !Number.isNaN(amount); if (!amountIsValid) { return msg.channel.createMessage('Invalid donation amount'); } return Promise.all([ msg.channel.createMessage(`${mention} paid $${amount.toFixed(2)}`), updateMemberRoleForDonation(guild, member, amount), ]); }, }; bot.on('messageCreate', async (msg) => { try { const content = msg.content; // Ignore any messages sent as direct messages. // The bot will only accept commands issued in // a guild. if (!msg.channel.guild) { return; } // Ignore any message that doesn't start with the correct prefix. if (!content.startsWith(PREFIX)) { return; } // Extract the parts and name of the command const parts = content.split(' ').map(s => s.trim()).filter(s => s); const commandName = parts[0].substr(PREFIX.length); // Get the requested command, if there is one. const command = commandForName[commandName]; if (!command) { return; } // If this command is only for the bot owner, refuse // to execute it for any other user. const authorIsBotOwner = msg.author.id === BOT_OWNER_ID; if (command.botOwnerOnly && !authorIsBotOwner) { return await msg.channel.createMessage('Hey, only my owner can issue that command!'); } // Separate the command arguments from the command prefix and name. const args = parts.slice(1); // Execute the command. await command.execute(msg, args); } catch (err) { console.warn('Error handling message create event'); console.warn(err); } }); bot.on('error', err => { console.warn(err); }); bot.connect();
Αυτό θα σας δώσει μια καλή βασική ιδέα για το πώς να δημιουργήσετε ένα bot Discord. Τώρα θα δούμε πώς να ενσωματώσουμε το bot με το Ko-fi. Εάν θέλετε, μπορείτε να δημιουργήσετε ένα webhook στο ταμπλό στο Ko-fi, βεβαιωθείτε ότι ο δρομολογητής σας έχει διαμορφωθεί ώστε να προωθεί τη θύρα 80 και να στέλνετε πραγματικά ζωντανά δοκιμαστικά webhooks για εσάς. Αλλά πρόκειται να το χρησιμοποιήσω Ταχυδρόμος για προσομοίωση αιτημάτων.
Τα webhooks από την Ko-fi παρέχουν ωφέλιμα φορτία που μοιάζουν με αυτό:
data: { 'message_id':'3a1fac0c-f960-4506-a60e-824979a74e74', 'timestamp':'2017-08-21T13:04:30.7296166Z', 'type':'Donation','from_name':'John Smith', 'message':'Good luck with the integration!', 'amount':'3.00', 'url':'https://ko-fi.com' }
Ας δημιουργήσουμε ένα νέο αρχείο προέλευσης που ονομάζεται webhook_listener.js και χρησιμοποιήστε το Express για να ακούσετε webhooks. Θα έχουμε μόνο μία διαδρομή Express και αυτό είναι για λόγους επίδειξης, επομένως δεν θα ανησυχούμε πάρα πολύ για τη χρήση μιας ιδιωματικής δομής καταλόγου. Θα βάλουμε απλώς όλη τη λογική του διακομιστή ιστού σε ένα αρχείο.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/webhook_listener_step6.js )
const express = require('express'); const app = express(); const PORT = process.env.PORT || 80; class WebhookListener { listen() { app.get('/kofi', (req, res) => { res.send('Hello'); }); app.listen(PORT); } } const listener = new WebhookListener(); listener.listen(); module.exports = listener;
Στη συνέχεια, ας απαιτήσουμε το νέο αρχείο στην κορυφή του bot.js, έτσι ώστε ο ακροατής να ξεκινά όταν εκτελούμε το bot.js.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step6.js )
const eris = require('eris'); const webhookListener = require('./webhook_listener.js');
Αφού ξεκινήσετε το bot, θα πρέπει να δείτε το 'Γεια' όταν μεταβείτε στο http: // localhost / kofi στο πρόγραμμα περιήγησής σας.
Τώρα ας έχουμε το WebhookListener
επεξεργαστείτε τα δεδομένα από το webhook και εκπέμψτε ένα συμβάν. Και τώρα που έχουμε δοκιμάσει ότι το πρόγραμμα περιήγησής μας μπορεί να έχει πρόσβαση στη διαδρομή, ας αλλάξουμε τη διαδρομή σε μια διαδρομή POST, καθώς το webhook από το Ko-fi θα είναι ένα αίτημα POST.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step7.js )
const express = require('express'); const bodyParser = require('body-parser'); const EventEmitter = require('events'); const PORT = process.env.PORT || 80; const app = express(); app.use(bodyParser.json()); class WebhookListener extends EventEmitter { listen() { app.post('/kofi', (req, res) => { const data = req.body.data; const { message, timestamp } = data; const amount = parseFloat(data.amount); const senderName = data.from_name; const paymentId = data.message_id; const paymentSource = 'Ko-fi'; // The OK is just for us to see in Postman. Ko-fi doesn't care // about the response body, it just wants a 200. res.send({ status: 'OK' }); this.emit( 'donation', paymentSource, paymentId, timestamp, amount, senderName, message, ); }); app.listen(PORT); } } const listener = new WebhookListener(); listener.listen(); module.exports = listener;
Στη συνέχεια πρέπει να κάνουμε το bot να ακούσει για την εκδήλωση, να αποφασίσει ποιος χρήστης δωρίζει και να τους αναθέσει έναν ρόλο. Για να αποφασίσουμε ποιος χρήστης δωρίζει, θα προσπαθήσουμε να βρούμε έναν χρήστη του οποίου το όνομα χρήστη είναι ένα υπόστρωμα του μηνύματος που λαμβάνεται από το Ko-fi. Οι δωρητές πρέπει να ενημερωθούν για να δώσουν το όνομα χρήστη τους (με το διακριτικό) στο μήνυμα από ό, τι γράφουν όταν κάνουν τη δωρεά τους.
Στο κάτω μέρος του bot.js:
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step7.js )
function findUserInString(str) { const lowercaseStr = str.toLowerCase(); // Look for a matching username in the form of username#discriminator. const user = bot.users.find( user => lowercaseStr.indexOf(`${user.username.toLowerCase()}#${user.discriminator}`) !== -1, ); return user; } async function onDonation( paymentSource, paymentId, timestamp, amount, senderName, message, ) { try { const user = findUserInString(message); const guild = user ? bot.guilds.find(guild => guild.members.has(user.id)) : null; const guildMember = guild ? guild.members.get(user.id) : null; return await updateMemberRoleForDonation(guild, guildMember, amount); } catch (err) { console.warn('Error handling donation event.'); console.warn(err); } } webhookListener.on('donation', onDonation); bot.connect();
Στο onDonation
συνάρτηση, βλέπουμε δύο παραστάσεις ενός χρήστη: ως Χρήστης και ως Μέλος. Και οι δύο αντιπροσωπεύουν το ίδιο άτομο, αλλά το αντικείμενο μέλους περιέχει συγκεκριμένες πληροφορίες για το χρήστη, όπως οι ρόλοι τους στη συντεχνία και το ψευδώνυμό τους. Δεδομένου ότι θέλουμε να προσθέσουμε έναν ρόλο, πρέπει να χρησιμοποιήσουμε την εκπροσώπηση των μελών του χρήστη. Κάθε χρήστης στο Discord έχει μια εκπροσώπηση μέλους για κάθε συντεχνία στο οποίο βρίσκεται.
εργαλεία ανάλυσης και οπτικοποίησης δεδομένων
Τώρα μπορώ να χρησιμοποιήσω τον Postman για να δοκιμάσω τον κωδικό.
Λαμβάνω έναν κωδικό κατάστασης 200 και λαμβάνω τον ρόλο που μου έχει παραχωρηθεί στον διακομιστή.
Εάν το μήνυμα από το Ko-fi δεν περιέχει έγκυρο όνομα χρήστη. ωστόσο, τίποτα δεν συμβαίνει. Ο δωρητής δεν έχει ρόλο και δεν γνωρίζουμε ότι λάβαμε μια ορφανή δωρεά. Ας προσθέσουμε ένα αρχείο καταγραφής για δωρεές, συμπεριλαμβανομένων δωρεών που δεν μπορούν να αποδοθούν σε ένα μέλος της συντεχνίας.
Πρώτα πρέπει να δημιουργήσουμε ένα κανάλι καταγραφής στο Discord και να λάβουμε το αναγνωριστικό καναλιού του. Το αναγνωριστικό καναλιού μπορεί να βρεθεί χρησιμοποιώντας τα εργαλεία προγραμματιστή, τα οποία μπορούν να ενεργοποιηθούν στις ρυθμίσεις του Discord. Στη συνέχεια, μπορείτε να κάνετε δεξί κλικ σε οποιοδήποτε κανάλι και να κάνετε κλικ στο 'Αντιγραφή αναγνωριστικού'.
Το αναγνωριστικό καναλιού καταγραφής πρέπει να προστεθεί στην ενότητα σταθερών του bot.js.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step8.js )
const LOG_CHANNEL_ID = '526653321109438474';
Και μετά μπορούμε να γράψουμε ένα logDonation
λειτουργία.
(Σύνδεσμος κώδικα GitHub: https://github.com/mistval/premium_bot/blob/master/src/bot_step8.js )
function logDonation(member, donationAmount, paymentSource, paymentId, senderName, message, timestamp) { const isKnownMember = !!member; const memberName = isKnownMember ? `${member.username}#${member.discriminator}` : 'Unknown'; const embedColor = isKnownMember ? 0x00ff00 : 0xff0000; const logMessage = { embed: { title: 'Donation received', color: embedColor, timestamp: timestamp, fields: [ { name: 'Payment Source', value: paymentSource, inline: true }, { name: 'Payment ID', value: paymentId, inline: true }, { name: 'Sender', value: senderName, inline: true }, { name: 'Donor Discord name', value: memberName, inline: true }, { name: 'Donation amount', value: donationAmount.toString(), inline: true }, { name: 'Message', value: message, inline: true }, ], } } bot.createMessage(LOG_CHANNEL_ID, logMessage); }
Τώρα μπορούμε να ενημερώσουμε onDonation
για να καλέσετε τη λειτουργία καταγραφής:
async function onDonation( paymentSource, paymentId, timestamp, amount, senderName, message, ) { try { const user = findUserInString(message); const guild = user ? bot.guilds.find(guild => guild.members.has(user.id)) : null; const guildMember = guild ? guild.members.get(user.id) : null; return await Promise.all([ updateMemberRoleForDonation(guild, guildMember, amount), logDonation(guildMember, amount, paymentSource, paymentId, senderName, message, timestamp), ]); } catch (err) { console.warn('Error updating donor role and logging donation'); console.warn(err); } }
Τώρα μπορώ να επικαλεστώ ξανά το webhook, πρώτα με ένα έγκυρο όνομα χρήστη και μετά χωρίς ένα, και έχω δύο ωραία μηνύματα καταγραφής στο κανάλι καταγραφής.
Προηγουμένως, στείλαμε απλώς συμβολοσειρές στο Discord για εμφάνιση ως μηνύματα. Το πιο περίπλοκο αντικείμενο JavaScript που δημιουργούμε και στέλνουμε στο Discord στο νέο logDonation
Η λειτουργία είναι ένας ειδικός τύπος μηνύματος που αναφέρεται ως πλούσια ενσωμάτωση . Μια ενσωμάτωση σάς προσφέρει κάποια σκαλωσιές για να κάνετε ελκυστικά μηνύματα όπως αυτά που εμφανίζονται. Μόνο bots μπορούν να δημιουργήσουν ενσωματώσεις, οι χρήστες δεν μπορούν.
Τώρα λαμβάνουμε ειδοποιήσεις για δωρεές, καταγραφή τους και επιβράβευση των υποστηρικτών μας. Μπορούμε επίσης να προσθέσουμε δωρεές χειροκίνητα με την εντολή addpayment σε περίπτωση που ένας χρήστης ξεχάσει να καθορίσει το όνομα χρήστη του όταν κάνει δωρεά. Ας το ονομάσουμε μια μέρα.
Ο ολοκληρωμένος κώδικας για αυτό το σεμινάριο είναι διαθέσιμος στο GitHub εδώ https://github.com/mistval/premium_bot
Δημιουργήσαμε με επιτυχία ένα bot που μπορεί να μας βοηθήσει να παρακολουθήσουμε τις δωρεές. Είναι κάτι που μπορούμε πραγματικά να χρησιμοποιήσουμε; Λοιπόν, ίσως. Καλύπτει τα βασικά, αλλά όχι πολύ περισσότερα. Ακολουθούν μερικές αδυναμίες που ίσως θέλετε να σκεφτείτε πρώτα:
Premium Member
ρόλου και αν ξανασυνδεθούν, δεν θα το πάρουν πίσω. Πρέπει να αποθηκεύσουμε τις πληρωμές ανά αναγνωριστικό χρήστη σε μια βάση δεδομένων, οπότε εάν ένα μέλος premium επανέλθει, μπορούμε να τους δώσουμε τον ρόλο τους και ίσως να τους στείλουμε ένα ωραίο μήνυμα καλωσορίσματος αν είμαστε τόσο διατεθειμένοι.Premium Member
ρόλο όταν οι συνολικές πληρωμές από έναν χρήστη φτάνουν τα 10 $ θα βοηθήσουν εδώ.Premium Member
ρόλος δωρεάν. Το Ko-fi δεν φαίνεται να υπογράφει webhooks, οπότε θα πρέπει να βασιστείτε σε κανέναν που δεν γνωρίζει τη διεύθυνση webhook (κακή) ή τη λίστα επιτρεπόμενων IP (λίγο καλύτερα).Υπάρχουν πάνω από δώδεκα ιστότοποι για την καταχώριση ρομπότ Discord και τη διάθεσή τους στο ευρύ κοινό, συμπεριλαμβανομένων DiscordBots.org και Discord.Bots.gg . Παρόλο που τα ρομπότ Discord είναι ως επί το πλείστον εισβολή των χόμπι μικρής διάρκειας, ορισμένα ρομπότ έχουν τεράστια δημοτικότητα και η διατήρησή τους εξελίσσεται σε μια περίπλοκη και απαιτητική δουλειά.
Σύμφωνα με το guild-count, ο Rythm είναι το πιο διαδεδομένο bot στο Discord. Το Rythm είναι ένα μουσικό bot του οποίου η ειδικότητα συνδέεται με κανάλια φωνής στο Discord και παίζει μουσική που ζητούν οι χρήστες. Ο Rythm βρίσκεται σήμερα σε πάνω από 2.850.000 συντεχνίες που περιέχουν συνολικό πληθυσμό περίπου 90 εκατομμυρίων χρηστών και στο απόγειό του παίζει ήχο για περίπου 100.000 ταυτόχρονους χρήστες σε 20.000 ξεχωριστά συντεχνίες. Ο δημιουργός και κύριος προγραμματιστής του Rythm, ImBursting, συμφώνησε να απαντήσει σε μερικές ερωτήσεις σχετικά με το πώς είναι να αναπτύξετε και να διατηρήσετε ένα bot μεγάλης κλίμακας όπως το Rythm.
Συνέντευξη: Μπορείτε να μας πείτε λίγα πράγματα για την αρχιτεκτονική υψηλού επιπέδου του Rythm και πώς φιλοξενείται;
ImBursting: Ο ρυθμός κλιμακώνεται σε 9 φυσικούς διακομιστές, ο καθένας έχει 32 πυρήνες, 96 GB μνήμης RAM και σύνδεση 10gbps. Αυτοί οι διακομιστές συγκεντρώνονται σε ένα κέντρο δεδομένων με τη βοήθεια μιας μικρής εταιρείας φιλοξενίας, GalaxyGate.
Φαντάζομαι ότι όταν άρχισες να δουλεύεις στο Rythm, δεν το σχεδίασες να κλιμακώσει οπουδήποτε πλησιάζει όσο έχει. Μπορείτε να μας πείτε για το πώς ξεκίνησε ο Rythm και την τεχνική του εξέλιξη με την πάροδο του χρόνου;
πώς να βρείτε πελάτες για διαβούλευση
Η πρώτη εξέλιξη του Rythm γράφτηκε στο Python, η οποία δεν είναι πολύ καλή γλώσσα, οπότε γύρω στο χρόνο χτυπήσαμε 10.000 διακομιστές (μετά από πολλές προσπάθειες κλιμάκωσης) συνειδητοποίησα ότι αυτό ήταν το μεγαλύτερο εμπόδιο και έτσι άρχισα να κωδικοποιώ το bot στην Java, ο λόγος Όντας οι βιβλιοθήκες ήχου της Java ήταν πολύ πιο βελτιστοποιημένες και ήταν γενικά μια πιο κατάλληλη γλώσσα για μια τόσο τεράστια εφαρμογή. Μετά την εκ νέου κωδικοποίηση, η απόδοση βελτιώθηκε δεκαπλάσια και κράτησε τα προβλήματα σε αναμονή για λίγο. Και μετά φτάσαμε στο ορόσημο των 300.000 διακομιστών όταν άρχισαν να εμφανίζονται ξανά προβλήματα, οπότε συνειδητοποίησα ότι απαιτείται περισσότερη κλιμάκωση, καθώς ένα JVM δεν ήταν σε θέση να χειριστεί όλα αυτά. Έτσι, αρχίσαμε αργά να εφαρμόζουμε βελτιώσεις και σημαντικές αλλαγές όπως συντονίζοντας τον συλλέκτη απορριμμάτων και χωρίζοντας τις φωνητικές συνδέσεις σε ξεχωριστές μικροσυσκευές χρησιμοποιώντας έναν διακομιστή ανοιχτού κώδικα που ονομάζεται Lavalink. Αυτή η βελτιωμένη απόδοση ήταν λίγο, αλλά ο τελευταίος γύρος της υποδομής ήταν όταν το χωρίσαμε σε 9 ξεχωριστά συμπλέγματα για εκτέλεση σε 9 φυσικούς διακομιστές και κάναμε προσαρμοσμένες μικροσυσκευές πύλης και στατιστικών για να βεβαιωθούμε ότι όλα λειτουργούσαν ομαλά όπως θα έκανε σε ένα μηχάνημα.
Παρατήρησα ότι ο Rythm διαθέτει έκδοση καναρινιών και λαμβάνετε κάποια βοήθεια από άλλους προγραμματιστές και προσωπικό. Φαντάζομαι ότι εσείς και η ομάδα σας πρέπει να καταβάλλετε μεγάλη προσπάθεια για να βεβαιωθείτε ότι τα πράγματα γίνονται σωστά. Μπορείτε να μας πείτε ποιες διαδικασίες περιλαμβάνονται στην ενημέρωση του Rythm;
Το Rythm canary είναι το alpha bot που χρησιμοποιούμε για να δοκιμάσουμε νέες λειτουργίες και βελτιώσεις απόδοσης, προτού τα αναπτύξουμε συνήθως στο Rythm 2 για να δοκιμάσουμε σε ευρύτερη κλίμακα και μετά να δημιουργήσουμε το Rythm. Το μεγαλύτερο πρόβλημα που αντιμετωπίζουμε είναι οι πολύ μεγάλοι χρόνοι επανεκκίνησης λόγω των ορίων ρυθμού Discord και αυτός είναι ο λόγος που προσπαθώ το καλύτερο για να βεβαιωθώ ότι μια ενημέρωση είναι έτοιμη πριν αποφασίσω να την προωθήσω.
Παίρνω πολλή βοήθεια από εθελοντές προγραμματιστές και άτομα που θέλουν πραγματικά να βοηθήσουν την κοινότητα, θέλω να βεβαιωθώ ότι όλα γίνονται σωστά και ότι οι άνθρωποι θα απαντούν πάντα στις ερωτήσεις τους και θα λαμβάνουν την καλύτερη δυνατή υποστήριξη, πράγμα που σημαίνει ότι είμαι συνεχώς στο αναζητήστε νέες ευκαιρίες.
Οι μέρες του Discord ως νέου παιδιού στο μπλοκ έχουν περάσει και τώρα είναι μία από τις μεγαλύτερες πλατφόρμες επικοινωνίας σε πραγματικό χρόνο στον κόσμο. Ενώ τα bots Discord είναι σε μεγάλο βαθμό το χτύπημα των μικρών χόμπι, μπορεί να δούμε τις εμπορικές ευκαιρίες να αυξάνονται καθώς ο πληθυσμός της υπηρεσίας συνεχίζει να αυξάνεται. Ορισμένες εταιρείες, όπως το προαναφερθέν Patreon, έχουν ήδη εισέλθει.
Σε αυτό το άρθρο, είδαμε μια επισκόπηση υψηλού επιπέδου της διεπαφής χρήστη του Discord, μια επισκόπηση υψηλού επιπέδου των API της, ένα πλήρες μάθημα στον προγραμματισμό bot Discord και ακούσαμε για το πώς είναι να λειτουργεί ένα bot σε επιχειρησιακή κλίμακα. Ελπίζω να έρθετε να ενδιαφέρεστε για την τεχνολογία και να αισθάνεστε σαν να καταλαβαίνετε τις βασικές αρχές του τρόπου λειτουργίας της.
Τα chatbots είναι γενικά διασκεδαστικά, εκτός εάν οι απαντήσεις τους στα περίπλοκα ερωτήματά σας έχουν το πνευματικό βάθος ενός φλιτζανιού νερού. Για να εξασφαλίσετε ένα υπέροχο UX για τους χρήστες σας δείτε Η συνομιλία συνομιλίας - όταν αποτυγχάνει ένα Chatbot από το ApeeScape Design Blog για 5 προβλήματα σχεδιασμού προς αποφυγή.
Σχετίζεται με: Βέλτιστες πρακτικές JS: Δημιουργήστε ένα Disc Disc Bot με TypeScript και Dependency InjectionΤο Discord bot είναι ένα αυτοματοποιημένο chatbot που λειτουργεί στο Discord, μια δημοφιλή πλατφόρμα επικοινωνίας κειμένου και φωνής. Τα bots είναι πανταχού παρόντα στο Discord και μπορούν να προγραμματιστούν για την παροχή πολλών διαφορετικών υπηρεσιών.
Ορισμένοι συνηθισμένοι ρόλοι που εκτελούν τα bots περιλαμβάνουν εποπτεία, παιχνίδι με χρήστες, αναπαραγωγή μουσικής σε κανάλια φωνής, αναζήτηση στο Διαδίκτυο και επεξεργασία πληρωμών. Τα bots συμπληρώνουν αμέτρητους άλλους κοινούς και εξειδικευμένους ρόλους επίσης.
Οι Eris (https://abal.moe/Eris/) και discord.js (https://discord.js.org/#/) είναι οι δύο επίσημα ελεγμένες βιβλιοθήκες JavaScript. Ενδέχεται να δείτε μερικές φορές τον κώδικα bot που εξαρτάται από παλαιότερες, μη διατηρημένες βιβλιοθήκες ή από μη αποθηκευμένες βιβλιοθήκες. Αυτά πρέπει γενικά να αποφεύγονται.
Μια βιβλιοθήκη bot φροντίζει για τις λεπτομέρειες της αλληλεπίδρασης με το WebSocket και το REST API του Discord, ώστε να μπορείτε να κωδικοποιήσετε σε υψηλότερο επίπεδο αφαίρεσης. Πολλές βιβλιοθήκες περιλαμβάνουν επίσης δυνατότητες υψηλότερου επιπέδου, όπως πλαίσια εντολών.
A + αν είπατε 'αναδημιουργήστε το αμέσως στην Πύλη προγραμματιστών Discord'. Οι διαρροές κουκκίδων είναι συχνό φαινόμενο, ιδίως στους προγραμματιστές αρχάριων και οι συνέπειες μπορεί να είναι σοβαρές. Οι ανιχνευτές ιστού παρακολουθούν το GitHub για διακριτικά bot που έχουν διαρρεύσει και τα bots που έχουν παραβιαστεί χρησιμοποιούνται για κακόβουλους σκοπούς.
Οποιοσδήποτε διαθέτει λογαριασμό Discord μπορεί να έχει πρόσβαση στην πύλη προγραμματιστών του Discord (https://discordapp.com/developers/applications/), να εγγράψει μια εφαρμογή, να δημιουργήσει έναν χρήστη bot και να αποκτήσει ένα διακριτικό bot. Από εκεί, μπορείτε να χρησιμοποιήσετε μια βιβλιοθήκη Discord της επιλογής σας για να προγραμματίσετε το bot σας.