So erstellen Sie ein Slack Plugin in Java

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Einleitung

Slack ist ein beliebtes Chat-System, das von Menschen und Unternehmen auf der ganzen Welt verwendet wird. Eines der Dinge, die es so beliebt machen, ist die Möglichkeit, eigene Plugins zu schreiben, die innerhalb eines einzigen Durchgangs mit Personen und Kanälen interagieren können. Dies verwendet ihre HTTP-API.

Slack bietet kein offizielles SDK zum Schreiben von Plugins mit Java an. Es gibt jedoch ein offiziell empfohlenes Community-SDK, das wir verwenden werden. Auf diese Weise können wir von einer Java-Codebasis aus auf fast die gesamte Slack-API zugreifen, ohne uns um die genauen Details der API kümmern zu müssen.

Wir werden dies nutzen, um einen kleinen Systemüberwachungsbot zu erstellen. Dadurch wird regelmäßig der Speicherplatz für den lokalen Computer abgerufen und Personen benachrichtigt, wenn Laufwerke zu voll werden.

2. Abrufen von API-Anmeldeinformationen

Bevor wir etwas mit Slack machen können, müssen wir eine neue App und einen Bot erstellen und diese mit unseren Kanälen verbinden .

Besuchen wir zunächst //api.slack.com/apps. Dies ist die Basis, von der aus wir unsere Slack-Apps verwalten. Von hier aus können wir eine neue App erstellen.

Wenn wir dies tun, müssen wir einen Namen für die App und einen Slack-Arbeitsbereich eingeben, um sie zu erstellen.

Sobald wir dies getan haben, wurde die App erstellt und ist bereit für die Arbeit mit uns. Auf dem nächsten Bildschirm können wir einen Bot erstellen. Dies ist ein gefälschter Benutzer, als den das Plugin fungiert.

Wie bei jedem normalen Benutzer müssen wir diesem einen Anzeigenamen und einen Benutzernamen geben. Dies sind die Einstellungen, die andere Benutzer im Slack-Arbeitsbereich für diesen Bot-Benutzer sehen, wenn sie jemals mit ihm interagieren.

Nachdem wir dies getan haben, können wir im Seitenmenü die Option „App installieren“ auswählen und die App zu unserem Slack-Arbeitsbereich hinzufügen . Sobald wir dies getan haben, kann die App mit unserem Arbeitsbereich interagieren.

Dadurch erhalten wir die Token, die wir für die Kommunikation unseres Plugins mit Slack benötigen.

Jeder Bot, der mit einem anderen Slack-Arbeitsbereich interagiert, verfügt über einen anderen Satz von Token. Unsere Anwendung benötigt den Wert "Bot User OAuth Access Token", wenn wir sie ausführen.

Schließlich müssen wir den Bot zu allen Kanälen einladen, an denen er beteiligt sein sollte . Dies funktioniert, indem Sie es einfach über den Kanal senden - in diesem Fall @system_monitoring .

3. Hinzufügen von Slack zu unserem Projekt

Bevor wir es verwenden können, müssen wir zuerst die Slack SDK-Abhängigkeiten zu unserer Datei pom.xml hinzufügen :

 com.hubspot.slack slack-base ${slack.version}   com.hubspot.slack slack-java-client ${slack.version} 

3. Anwendungsstruktur

Der Kern unserer Anwendung ist die Möglichkeit, das System auf Fehler zu überprüfen. Wir werden dies mit dem Konzept einer Fehlerprüfung darstellen. Dies ist eine einfache Schnittstelle mit einer einzigen Methode, die ausgelöst wird, um nach Fehlern zu suchen und diese zu melden:

public interface ErrorChecker { void check(); }

Wir möchten auch die Möglichkeit haben, gefundene Fehler zu melden. Dies ist eine weitere einfache Schnittstelle, die eine Problembeschreibung aufnimmt und entsprechend meldet:

public interface ErrorReporter { void reportProblem(String problem); }

Die Verwendung einer Schnittstelle ermöglicht es uns, Probleme auf unterschiedliche Weise zu melden. Beispielsweise haben wir möglicherweise eine, die E-Mails sendet, ein Fehlermeldesystem kontaktiert oder Nachrichten an unser Slack-System sendet, damit die Benutzer eine sofortige Benachrichtigung erhalten.

Das Design dahinter ist, dass jede ErrorChecker- Instanz einen eigenen ErrorReporter erhält , den sie verwenden kann. Dies gibt uns die Flexibilität, unterschiedliche Fehlerberichterstatter für unterschiedliche Prüfer zu verwenden, da einige Fehler möglicherweise wichtiger sind als andere. Wenn die Festplatten beispielsweise zu über 90% voll sind und möglicherweise eine Nachricht an einen Slack-Kanal erforderlich ist, aber zu über 98% voll sind, möchten wir möglicherweise stattdessen private Nachrichten an bestimmte Personen senden.

4. Überprüfen des Speicherplatzes

Unsere Fehlerprüfung überprüft den Speicherplatz auf dem lokalen System. Jedes Dateisystem, das weniger als einen bestimmten Prozentsatz frei hat, wird als Fehler angesehen und als solcher gemeldet.

Wir werden die in Java 7 eingeführte NIO2 FileStore- API verwenden, um diese Informationen plattformübergreifend abzurufen .

Schauen wir uns nun unseren Fehlerprüfer an:

public class DiskSpaceErrorChecker implements ErrorChecker { private static final Logger LOG = LoggerFactory.getLogger(DiskSpaceErrorChecker.class); private ErrorReporter errorReporter; private double limit; public DiskSpaceErrorChecker(ErrorReporter errorReporter, double limit) { this.errorReporter = errorReporter; this.limit = limit; } @Override public void check() { FileSystems.getDefault().getFileStores().forEach(fileStore -> { try { long totalSpace = fileStore.getTotalSpace(); long usableSpace = fileStore.getUsableSpace(); double usablePercentage = ((double) usableSpace) / totalSpace; if (totalSpace > 0 && usablePercentage < limit) { String error = String.format("File store %s only has %d%% usable disk space", fileStore.name(), (int)(usablePercentage * 100)); errorReporter.reportProblem(error); } } catch (IOException e) { LOG.error("Error getting disk space for file store {}", fileStore, e); } }); } }

Hier erhalten wir die Liste aller Dateispeicher auf dem lokalen System und überprüfen sie dann einzeln. Jeder, der weniger als unser definiertes Limit als nutzbarer Speicherplatz hat, generiert mit unserem Fehlerreporter einen Fehler.

5. Senden von Fehlern an Slack-Kanäle

We now need to be able to report our errors. Our first reporter will be one that sends messages to a Slack channel. This allows anyone in the channel to see the message, in the hope that somebody will react to it.

This uses a SlackClient, from the Slack SDK, and the name of the channel to send the messages to. It also implements our ErrorReporter interface so that we can easily plug it into whichever error checker wants to use it:

public class SlackChannelErrorReporter implements ErrorReporter { private SlackClient slackClient; private String channel; public SlackChannelErrorReporter(SlackClient slackClient, String channel) { this.slackClient = slackClient; this.channel = channel; } @Override public void reportProblem(String problem) { slackClient.postMessage( ChatPostMessageParams.builder() .setText(problem) .setChannelId(channel) .build() ).join().unwrapOrElseThrow(); } }

6. Application Wiring

We are now in a position to wire up the application and have it monitor our system. For the sake of this tutorial, we're going to use the Java Timer and TimerTask that are part of the core JVM, but we could just as easily use Spring or any other framework to build this.

For now, this will have a single DiskSpaceErrorChecker that reports any disks that are under 10% usable to our “general” channel, and which runs every 5 minutes:

public class MainClass { public static final long MINUTES = 1000 * 60; public static void main(String[] args) throws IOException { SlackClientRuntimeConfig runtimeConfig = SlackClientRuntimeConfig.builder() .setTokenSupplier(() -> "") .build(); SlackClient slackClient = SlackClientFactory.defaultFactory().build(runtimeConfig); ErrorReporter slackChannelErrorReporter = new SlackChannelErrorReporter(slackClient, "general"); ErrorChecker diskSpaceErrorChecker10pct = new DiskSpaceErrorChecker(slackChannelErrorReporter, 0.1); Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { diskSpaceErrorChecker10pct.check(); } }, 0, 5 * MINUTES); } }

We need to replace “” with the token that was obtained earlier, and then we're ready to run. As soon as we do, if everything is correct, our plugin will check the local drives and message the Slack if there are any errors.

7. Sending Errors as Private Messages

Next, we're going to add an error reporter that sends private messages instead. This can be useful for more urgent errors since it will immediately ping a specific user instead of relying on someone in the channel to react.

Our error reporter here is more complicated because it needs to interact with a single, targeted user:

public class SlackUserErrorReporter implements ErrorReporter { private SlackClient slackClient; private String user; public SlackUserErrorReporter(SlackClient slackClient, String user) { this.slackClient = slackClient; this.user = user; } @Override public void reportProblem(String problem) { UsersInfoResponse usersInfoResponse = slackClient .lookupUserByEmail(UserEmailParams.builder() .setEmail(user) .build() ).join().unwrapOrElseThrow(); ImOpenResponse imOpenResponse = slackClient.openIm(ImOpenParams.builder() .setUserId(usersInfoResponse.getUser().getId()) .build() ).join().unwrapOrElseThrow(); imOpenResponse.getChannel().ifPresent(channel -> { slackClient.postMessage( ChatPostMessageParams.builder() .setText(problem) .setChannelId(channel.getId()) .build() ).join().unwrapOrElseThrow(); }); } }

What we have to do here is to find the user that we are messaging — looked up by email address, since this is the one thing that can't be changed. Next, we open an IM channel to the user, and then we post our error message to that channel.

This can then be wired up in the main method, and we will alert a single user directly:

ErrorReporter slackUserErrorReporter = new SlackUserErrorReporter(slackClient, "[email protected]"); ErrorChecker diskSpaceErrorChecker2pct = new DiskSpaceErrorChecker(slackUserErrorReporter, 0.02); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { diskSpaceErrorChecker2pct.check(); } }, 0, 5 * MINUTES);

Once done, we can run this up and get private messages for errors as well.

8. Conclusion

Wir haben hier gesehen, wie wir Slack in unsere Werkzeuge integrieren können, damit wir Feedback entweder an das gesamte Team oder an einzelne Mitglieder senden können. Mit der Slack-API können wir noch viel mehr tun. Warum also nicht sehen, was wir sonst noch integrieren können?

Wie üblich finden Sie den Quellcode für diesen Artikel auf GitHub.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs