private static ServerWebhook _server; // webhook messaging server / сервер рассылки сообщений через вебхуки /// <summary> /// get access to server /// получить доступ к серверу /// </summary> /// <returns></returns> public static ServerWebhook GetServer() { if (_server == null) { _server = new ServerWebhook(); } return(_server); }
/// <summary> /// send /// отправить /// </summary> public void Send() { byte[] screenshot = null; lock (ServerWebhook.GetServer().LokerMessanger) { for (int i = 0; i < ServerWebhook.GetServer().Webhooks.Length; i++) { Send(ServerWebhook.GetServer().Webhooks[i], Message, NameBot, screenshot); } } }
private void buttonAccept_Click(object sender, RoutedEventArgs e) // accept / принять { ServerWebhook serverWebhook = ServerWebhook.GetServer(); serverWebhook.SlackBotToken = TextBoxSlackBotToken.Text; serverWebhook.MustSendChartScreenshots = CheckBoxSendScreenshots.IsChecked.Value; string[] lockal = TextBoxWebhooks.Text.Split('\r'); string shit = ""; for (int i = 0; i < lockal.Length; i++) { shit += lockal[i]; } lockal = shit.Split('\n'); string[] lockal2 = null; for (int i = 0, ii = 0; i < lockal.Length; i++) { if (lockal[i] != "") { if (lockal2 == null) { lockal2 = new string[1]; lockal2[0] = lockal[i]; ii++; } else { string[] newLock = new string[lockal2.Length + 1]; for (int iii = 0; iii < lockal2.Length; iii++) { newLock[iii] = lockal2[iii]; } newLock[ii] = lockal[i]; lockal2 = newLock; ii++; } } } serverWebhook.Webhooks = lockal2; serverWebhook.Save(); Close(); }
/// <summary> /// must send screenshot for the message? /// должны отправить скриншот для сообщения? /// </summary> private bool MustSendScreenshotFor(LogMessage message) { if (!ServerWebhook.GetServer().MustSendChartScreenshots) { return(false); } switch (message.Type) { case LogMessageType.Trade: case LogMessageType.Signal: return(true); default: return(false); } }
// HOWTO // // 1 Create Slack app // 2 Set slack app scopes: https://api.slack.com/apps/<app_id>/oauth // "OAuth & Permissions" - "Scopes" - "Upload and modify files as user" // (it is only necessary for screenshots) // 3 Switch on webhooks: https://api.slack.com/apps/<app_id>/incoming-webhooks "Incoming Webhooks" - "On" // 4 Add new webhook: https://api.slack.com/apps/<app_id>/incoming-webhooks "Add New Webhook to Workspace" // // 1 Создайте приложение Slack // 2 Установите scopes для приложения: https://api.slack.com/apps/<app_id>/oauth // "OAuth & Permissions" - "Scopes" - "Upload and modify files as user" // (это нужно только для отправки скриншотов) // 3 Включите вебхуки: https://api.slack.com/apps/<app_id>/incoming-webhooks "Incoming Webhooks" - "On" // 4 Добавьте новый вебхук: https://api.slack.com/apps/<app_id>/incoming-webhooks "Add New Webhook to Workspace" /// <summary> /// send message to Slack /// отправить сообщение в Slack /// </summary> /// <param name="webhook"> webhook / вебхук </param> /// <param name="message"> log message / сообщение из лога </param> /// <param name="botName"> bot name / имя бота </param> /// <param name="file"> file (chart screenshot) / скриншот чарта </param> private void SendSlackMessage(string webhook, LogMessage message, string botName, byte[] file = null) { SlackMessage payload = SlackPayload(message, botName); string uploadToken = ServerWebhook.GetServer().SlackBotToken; if (!String.IsNullOrEmpty(uploadToken) && file != null) { // upload file to Slack / загрузить файл в Slack string uploadUrl = "https://slack.com/api/files.upload"; var uploadRequest = new RestRequest(Method.POST); uploadRequest.AddParameter("token", uploadToken); uploadRequest.AddFile("file", file, $"chart_{WebUtcTime(message.Time)}.png"); uploadRequest.AddHeader("Content-Type", "multipart/form-data"); var uploadResult = new RestClient(uploadUrl).Execute(uploadRequest); if (uploadResult.StatusCode == HttpStatusCode.OK) { // make file as public (must be public to send it to chat) // сделать файл публичным (должен быть публичным для отправки его в чат) string uploadResultJson = uploadResult.Content; string imageId = JsonConvert.DeserializeObject <SlackUploadResult>(uploadResultJson).File.Id; string shareImageUrl = "https://slack.com/api/files.sharedPublicURL"; var shareImageRequest = new RestRequest(Method.POST); shareImageRequest.AddParameter("token", uploadToken); shareImageRequest.AddParameter("file", imageId); shareImageRequest.AddHeader("Content-Type", "application/json"); var shareImageResult = new RestClient(shareImageUrl).Execute(shareImageRequest); if (shareImageResult.StatusCode == HttpStatusCode.OK) { // will serialize message with link to the file / будем сериализовать сообщение со ссылкой на файл string shareImageResultJson = shareImageResult.Content; string imageUrl = JsonConvert.DeserializeObject <SlackUploadResult>(shareImageResultJson).File.Permalink_public; payload.Attachments[0].Image_url = imageUrl; } } } PostJson(webhook, SerializedString(payload)); }
/// <summary> /// send /// отправить /// </summary> public void Send() { byte[] screenshot; if (MustSendScreenshotFor(Message)) { Thread.Sleep(5000); screenshot = GetChartScreenshotBytes(NameBot, Message.Message); } else { screenshot = null; }; lock (ServerWebhook.GetServer().LokerMessanger) { for (int i = 0; i < ServerWebhook.GetServer().Webhooks.Length; i++) { Send(ServerWebhook.GetServer().Webhooks[i], Message, NameBot, screenshot); } } }
public ServerWebhookDeliveryUi() // constructor / конструктор { InitializeComponent(); ServerWebhook serverWebhook = ServerWebhook.GetServer(); TextBoxSlackBotToken.Text = serverWebhook.SlackBotToken; CheckBoxSendScreenshots.IsChecked = serverWebhook.MustSendChartScreenshots; TextBoxWebhooks.Text = ""; if (serverWebhook.Webhooks != null) { for (int i = 0; i < serverWebhook.Webhooks.Length; i++) { TextBoxWebhooks.Text += serverWebhook.Webhooks[i] + "\r\n"; } } Title = OsLocalization.Logging.TitleEmailServer; ButtonAccept.Content = OsLocalization.Logging.Button1; Label16.Content = OsLocalization.Logging.Label16; Label17.Content = OsLocalization.Logging.Label17; CheckBoxSendScreenshots.Content = OsLocalization.Logging.Label18; }
private void ButtonWebhookGlobeSet_Click(object sender, RoutedEventArgs e) // button to configure the webhook server / кнопка настроить сервер рассылки сообщений через вебхуки { ServerWebhook.GetServer().ShowDialog(); }
/// <summary> /// Send message. If this message type is subscribed and distribution servers are configured, the message will be sent /// If test server is enabled, the message will not be sent /// Отправить сообщение. Если такой тип сообщений подписан на рассылку и сервера рассылки настроены, сообщение будет отправлено /// Если включен тестовый сервер - сообщение не будет отправленно /// </summary> public void AddNewMessage(LogMessage message) { if (_startProgram != StartProgram.IsOsTrader) { return; } if (WebhookSendOn) { if (message.Type == LogMessageType.Connect && WebhookConnectSendOn) { ServerWebhook.GetServer().Send(message, _name); } if (message.Type == LogMessageType.Error && WebhookErrorSendOn) { ServerWebhook.GetServer().Send(message, _name); } if (message.Type == LogMessageType.Signal && WebhookSignalSendOn) { ServerWebhook.GetServer().Send(message, _name); } if (message.Type == LogMessageType.System && WebhookSystemSendOn) { ServerWebhook.GetServer().Send(message, _name); } if (message.Type == LogMessageType.Trade && WebhookTradeSendOn) { ServerWebhook.GetServer().Send(message, _name); } } if (MailSendOn) { if (message.Type == LogMessageType.Connect && MailConnectSendOn) { ServerMail.GetServer().Send(message, _name); } if (message.Type == LogMessageType.Error && MailErrorSendOn) { ServerMail.GetServer().Send(message, _name); } if (message.Type == LogMessageType.Signal && MailSignalSendOn) { ServerMail.GetServer().Send(message, _name); } if (message.Type == LogMessageType.System && MailSystemSendOn) { ServerMail.GetServer().Send(message, _name); } if (message.Type == LogMessageType.Trade && MailTradeSendOn) { ServerMail.GetServer().Send(message, _name); } } if (SmsSendOn) { if (message.Type == LogMessageType.Connect && SmsConnectSendOn) { ServerSms.GetSmsServer().Send(message.GetString()); } if (message.Type == LogMessageType.Error && SmsErrorSendOn) { ServerSms.GetSmsServer().Send(message.GetString()); } if (message.Type == LogMessageType.Signal && SmsSignalSendOn) { ServerSms.GetSmsServer().Send(message.GetString()); } if (message.Type == LogMessageType.System && SmsSystemSendOn) { ServerSms.GetSmsServer().Send(message.GetString()); } if (message.Type == LogMessageType.Trade && SmsTradeSendOn) { ServerSms.GetSmsServer().Send(message.GetString()); } } }