Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 43 additions & 27 deletions Zero-K.info/Controllers/GithubController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,47 +33,63 @@ public async Task<ActionResult> Hook()

dynamic payload = JObject.Parse(Encoding.UTF8.GetString(data));

string text = null;
string channel = "zkdev";
Object[] values;
if (eventType == "issues" && payload.repository.name == "CrashReports") channel = "crashreports";

switch (eventType) {
string text = FormatEvent(eventType, payload, false);
if (text != null) await Global.Server.GhostChanSayMarkdown(channel, text, FormatEvent(eventType, payload, true));

return Content("");
}

// the rest (edited, labeled, synchronize, ...) is noise
private static readonly HashSet<string> relayedActions = new HashSet<string>() { "opened", "reopened", "closed" };

/// <summary>
/// One line per event or commit, without PR bodies or full commit messages.
/// Markdown is for discord, where links collapse to their label; chobby needs bare urls at the end of a line to make them clickable
/// </summary>
private static string FormatEvent(string eventType, dynamic payload, bool markdown)
{
string repo = payload.repository.name;
string sender = payload.sender.login;
string action = payload.action;

switch (eventType)
{
case "issues":
if (payload.action == "labeled"){
break;
}
if (payload.repository.name == "CrashReports"){
channel = "crashreports";
}
values = new [] {payload.repository.name ,payload.sender.login, payload.action, payload.issue.title, payload.issue.html_url};
text = string.Format("[{0}] {1} has {2} issue {3} <{4}>",values);
break;
if (!relayedActions.Contains(action)) return null;
return FormatLine($"{sender} {action} issue ", $"{repo}#{payload.issue.number}", (string)payload.issue.html_url, $": {payload.issue.title}", markdown);

case "pull_request":
values = new [] {payload.repository.name ,payload.sender.login, payload.action, payload.number, payload.pull_request.title , payload.pull_request.html_url, payload.pull_request.body};
text = string.Format("[{0}] {1} has {2} pull request #{3}: {4} <{5}>\n{6}",values);
break;
if (!relayedActions.Contains(action)) return null;
dynamic pr = payload.pull_request;
if (action == "closed" && (bool)pr.merged) action = "merged";
return FormatLine($"{sender} {action} PR ", $"{repo}#{payload.number}", (string)pr.html_url, $": {pr.title} (+{pr.additions} -{pr.deletions})", markdown);

case "push":
if (payload["ref"] != "refs/heads/master"
&& payload["ref"] != "refs/heads/stable")
break;
string branch = payload["ref"];
if (branch != "refs/heads/master" && branch != "refs/heads/stable") return null;

var commits = (JArray)payload.commits;
if (commits.Count == 0) return null;

var sb = new StringBuilder();
int count = 0;
dynamic commits = payload.commits;
var sb = new StringBuilder(FormatLine($"{sender} pushed ", $"{commits.Count} commit{(commits.Count == 1 ? "" : "s")}", (string)payload.compare, $" to {repo}/{branch.Substring("refs/heads/".Length)}:", markdown));
foreach (dynamic commit in commits)
{
sb.AppendFormat("\n~~ ~~\n{0} <{1}>", commit.message, commit.url);
count++;
string id = commit.id;
string message = commit.message;
sb.Append('\n').Append(FormatLine("", id.Substring(0, 7), (string)commit.url, " " + message.Split('\n')[0].TrimEnd(), markdown));
}
if (count > 0) text = $"[{payload.repository.name}] {payload.sender.login} has pushed {count} commits: {sb}";
break;
return sb.ToString();
}

if (text != null) await Global.Server.GhostChanSay(channel, text);
return null;
}

return Content("");
private static string FormatLine(string before, string label, string url, string after, bool markdown)
{
return markdown ? $"{before}[{label}](<{url}>){after}" : $"{before}{label}{after} {url}";
}
}
}
8 changes: 8 additions & 0 deletions ZkLobbyServer/ChatRelay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,14 @@ private void TimerCallback(object state)
}
}

/// <summary>
/// Relays a message as if said in the lobby, for when the lobby itself got different text
/// </summary>
public void RelayFromLobby(ChatRelayMessage msg)
{
OnAnySourceMessage(zklsRelay, msg);
}

private void OnAnySourceMessage(IChatRelaySource source, ChatRelayMessage msg)
{
if (channels.Contains(msg.Channel))
Expand Down
18 changes: 18 additions & 0 deletions ZkLobbyServer/ZkLobbyServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,24 @@ public Task GhostChanSay(string channelName, string text, bool isEmote = true, b
});
}

/// <summary>
/// Says plain text in the lobby channel, but relays markdown text to discord
/// </summary>
public async Task GhostChanSayMarkdown(string channelName, string text, string markdownText)
{
await GhostSay(new Say()
{
User = GlobalConst.NightwatchName,
IsEmote = true,
Place = SayPlace.Channel,
Time = DateTime.UtcNow,
Target = channelName,
Text = text,
AllowRelay = false
});
chatRelay.RelayFromLobby(new ChatRelayMessage(channelName, GlobalConst.NightwatchName, markdownText, SaySource.Zk, true));
}

public async Task RequestJoinPlanet(string name, int planetId, string attackerFaction)
{
var conus = ConnectedUsers.Get(name);
Expand Down
Loading