/*
* Copyright 2014 gitblit.com.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gitblit.plugin.slack;
import java.io.IOException;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;
import ro.fortsoft.pf4j.Extension;
import com.gitblit.manager.IRuntimeManager;
import com.gitblit.models.UserModel;
import com.gitblit.plugin.slack.entity.Payload;
import com.gitblit.servlet.GitblitContext;
import com.gitblit.transport.ssh.commands.CommandMetaData;
import com.gitblit.transport.ssh.commands.DispatchCommand;
import com.gitblit.transport.ssh.commands.SshCommand;
import com.gitblit.transport.ssh.commands.UsageExample;
import com.gitblit.transport.ssh.commands.UsageExamples;
import com.gitblit.utils.ActivityUtils;
import com.gitblit.utils.StringUtils;
@Extension
@CommandMetaData(name = "slack", description = "Slack commands")
public class SlackDispatcher extends DispatchCommand {
@Override
protected void setup() {
boolean canAdmin = getContext().getClient().getUser().canAdmin();
boolean canPost = getContext().getGitblit().getSettings().getBoolean(Plugin.SETTING_ALLOW_USER_POSTS, false);
if (canAdmin || canPost) {
register(TestCommand.class);
register(MessageCommand.class);
}
}
@CommandMetaData(name = "test", description = "Post a test message")
@UsageExamples(examples = {
@UsageExample(syntax = "${cmd}", description = "Posts a test message to the default channel"),
@UsageExample(syntax = "${cmd} #channel", description = "Posts a test message to #channel"),
@UsageExample(syntax = "${cmd} @james", description = "Posts a test direct message to james")
})
public static class TestCommand extends SshCommand {
@Argument(index = 0, metaVar = "#CHANNEL|@USER", usage = "Destination Channel or User for message")
String channel;
/**
* Post a test message
*/
@Override
public void run() throws Failure {
Payload payload = Payload.instance("Test message sent from Gitblit");
payload.iconEmoji(":envelope:");
if (!StringUtils.isEmpty(channel)) {
payload.channel(channel);
}
String displayName = getContext().getClient().getUser().getDisplayName();
payload.username(displayName);
try {
IRuntimeManager runtimeManager = GitblitContext.getManager(IRuntimeManager.class);
Slacker.init(runtimeManager);
Slacker.instance().send(payload);
} catch (IOException e) {
throw new Failure(1, e.getMessage(), e);
}
}
}
@CommandMetaData(name = "send", aliases = { "post" }, description = "Asynchronously post a message")
@UsageExamples(examples = {
@UsageExample(syntax = "${cmd} -m \"'this is a test'\"", description = "Asynchronously posts a message to the default channel"),
@UsageExample(syntax = "${cmd} #channel -m \"'this is a test'\"", description = "Asynchronously posts a message to #channel"),
@UsageExample(syntax = "${cmd} @james -m \"'this is a test'\"", description = "Asynchronously posts a direct message to james")
})
public static class MessageCommand extends SshCommand {
@Argument(index = 0, metaVar = "#CHANNEL|@USER", usage = "Destination Channel or User for message")
String channel;
@Option(name = "--message", aliases = {"-m" }, metaVar = "-|MESSAGE", required = true)
String message;
@Option(name = "--emoji", metaVar = "EMOJI")
String emoji = null;
/**
* Post a message
*/
@Override
public void run() throws Failure {
UserModel user = getContext().getClient().getUser();
Payload payload = Payload.instance(message);
payload.username(user.getDisplayName());
payload.unfurlLinks(true);
if (!StringUtils.isEmpty(emoji)) {
payload.icon(emoji);
} else {
if (StringUtils.isEmpty(user.emailAddress)) {
payload.iconEmoji(":envelope:");
} else {
String url = ActivityUtils.getGravatarThumbnailUrl(user.emailAddress, 36);
payload.iconUrl(url);
}
}
if (!StringUtils.isEmpty(channel)) {
payload.channel(channel);
}
IRuntimeManager runtimeManager = GitblitContext.getManager(IRuntimeManager.class);
Slacker.init(runtimeManager);
Slacker.instance().sendAsync(payload);
}
}
}