static async Task Main(string[] args) { // Register for GB2312 encoding Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // Configurate notifier if (!File.Exists(SCKEYFileName) || File.ReadAllText(SCKEYFileName).Trim().Equals("")) { File.Create(SCKEYFileName); Console.WriteLine(@"Please configurate your SCKEY in file """ + SCKEYFileName + @""", you can generate your unique SCKEY from http://sc.ftqq.com/."); return; } string SCKEY = File.ReadAllText(SCKEYFileName).Trim(); wechatNotifier = new WechatNotifier(SCKEY); Console.WriteLine($"{DateTime.Now} | SCKEY = {SCKEY}"); // Start int errTime = 0; bool sentErr = false; while (true) { List <string> USTCList = await GetUSTCList(); if (USTCList.Count == 0) { errTime++; // Only send once every error period. if (errTime >= 10 && !sentErr) { sentErr = wechatNotifier.SendNotifier("[异常] USTCLIST 获取失败", "USTC List 已连续 10 次获取失败,请检查调试!"); } Console.WriteLine($"[Err] {DateTime.Now} Failed to get list."); continue; } // Reset error send status. errTime = 0; sentErr = false; UpdateListAndNotify(USTCList); System.Threading.Thread.Sleep(15000); } }
public void AddReservationNotifyWechatMessage(String playerId, String operatorId, String result, Pool targetPool, Pool originalPool, DateTime gameDate) { if (IsReservationLocked(gameDate)) { return; } Player player = FindPlayerById(playerId); //if (player.Marked && result == Constants.CANCELLED) return; Player user = operatorId == null ? null : FindPlayerById(operatorId); String message = null; int numberOfReservedPlayerInTargetPool = targetPool.FindGameByDate(gameDate).NumberOfReservedPlayers; String poolAndGameDate = " of the " + targetPool.DayOfWeek + " volleyball on " + gameDate.ToString("MM/dd/yyyy") + " in pool " + targetPool.Name + "."; String playerNumber = " Total player number in pool : " + numberOfReservedPlayerInTargetPool; if (result == Constants.RESERVED || result == Constants.CANCELLED) { if (playerId == operatorId) { message = "You " + result.ToString() + poolAndGameDate; } else { message = (user == null ? "Admin" : user.Name) + " " + result.ToString() + poolAndGameDate; } if (EastDateTimeToday.AddDays(7) < gameDate) { WechatNotifier.AddNotifyWechatMessage(targetPool, player, message); } else { message = message + playerNumber; Game game = targetPool.FindGameByDate(gameDate); if (game.Factor > 0) { message = message + ". Current factor is " + game.Factor; } WechatNotifier.AddNotifyWechatMessage(targetPool, player, message); if (player.Role != (int)Roles.Guest && result == Constants.RESERVED && wechatNotifier.EnableReserveEmoMessage) { int emoType = (int)EmoTypes.Reserve; WechatNotifier.AddNotifyWechatMessage(targetPool, player, wechatNotifier.GetEmoMessage(emoType, numberOfReservedPlayerInTargetPool)); } if (player.Role != (int)Roles.Guest && result == Constants.CANCELLED && wechatNotifier.EnableCancelEmoMessage) { int emoType = (int)EmoTypes.Cancel; WechatNotifier.AddNotifyWechatMessage(targetPool, player, wechatNotifier.GetEmoMessage(emoType, numberOfReservedPlayerInTargetPool)); } } } else if (result == Constants.WAITING_TO_RESERVED) { message = "Congratus! One spot became available in pool " + targetPool.Name + ", and reserved it for you." + playerNumber; Game game = targetPool.FindGameByDate(gameDate); if (game.Factor > 0) { message = message + ". Current factor is " + game.Factor; } WechatNotifier.AddNotifyWechatMessage(player, message); if (EastDateTimeToday == gameDate.Date && EastDateTimeNow.Hour >= lockWaitingListHour) { WechatNotifier.AddNotifyWechatMessage(player, "It is kind of late, if you cannot make it, please cancel it right away. Thank you!"); } WechatNotifier.AddNotifyWechatMessage(targetPool, player, message); } else if (result == Constants.MOVED) { message = result.ToString() + " from pool " + originalPool.Name + " to pool " + targetPool.Name + " for the " + targetPool.DayOfWeek + " volleyball on " + gameDate.ToString("MM/dd/yyyy"); WechatNotifier.AddNotifyWechatMessage(player, message); String wechatMessage = message + ". Total player number in pool " + originalPool.Name + ": " + originalPool.FindGameByDate(gameDate).NumberOfReservedPlayers; Game game = originalPool.FindGameByDate(gameDate); if (game.Factor > 0) { wechatMessage = wechatMessage + ". Current factor is " + game.Factor; } WechatNotifier.AddNotifyWechatMessage(originalPool, player, wechatMessage); wechatMessage = message + ". Total player number in pool " + targetPool.Name + ": " + numberOfReservedPlayerInTargetPool; game = targetPool.FindGameByDate(gameDate); if (game.Factor > 0) { wechatMessage = wechatMessage + ". Current factor is " + game.Factor; } WechatNotifier.AddNotifyWechatMessage(targetPool, player, wechatMessage); if (wechatNotifier.EnableReserveEmoMessage) { WechatNotifier.AddNotifyWechatMessage(targetPool, player, wechatNotifier.GetEmoMessage((int)EmoTypes.Move, numberOfReservedPlayerInTargetPool)); } } else if (result == Constants.WAITING) { message = (user == null ? "Admin" : (playerId == operatorId? "You" : user.Name)) + " " + result.ToString(); WechatNotifier.AddNotifyWechatMessage(targetPool, player, message + poolAndGameDate); } }
private void Timer_Tick(object sender, EventArgs e) { // Update stock list current price information Share share = null; foreach (ListViewItem lvi in listView_StockList.Items) { share = GetShareByCode(lvi.Text); // if (!IsTradingTime(share.shareData.dataTime)) continue; lvi.SubItems[subitemIndex_CurrentPrice].Text = share.shareData.currentPrice; if (lvi.SubItems[subitemIndex_CurrentPrice].Text != "") { int warningType = -1; float currentPrice = float.Parse(lvi.SubItems[subitemIndex_CurrentPrice].Text); float upPrice = lvi.SubItems[subitemIndex_UpPrice].Text == "" ? 0 : float.Parse(lvi.SubItems[subitemIndex_UpPrice].Text); float downPrice = lvi.SubItems[subitemIndex_DownPrice].Text == "" ? 0 : float.Parse(lvi.SubItems[subitemIndex_DownPrice].Text); if (currentPrice == 0) { continue; } // Warning Type jugement if (upPrice != 0 && upPrice <= currentPrice) { warningType = 0; } if (downPrice != 0 && downPrice >= currentPrice) { warningType = 1; } if (warningType != -1) { // Highlight warning item in listview lvi.ForeColor = warningType == 0 ? Color.Red : Color.Green; if (!WarningMessageBox.isShareBind(share)) { // Wechat notify int retry = 3; string title = "[" + share.shareInfo.shareUrlCode + "] " + share.shareData.shareName + " 触发" + (warningType == 0 ? "上" : "下") + "破价格 " + lvi.SubItems[subitemIndex_DownPrice].Text; string content = title + ", 现价 " + share.shareData.currentPrice; WechatNotifier wechatNotifier = new WechatNotifier(Notify_SCKEY); if (wechatNotify.Checked) { int i = 1; for ( ; i <= retry; i++) { if (wechatNotifier.SendNotifier(title, content)) { break; } } if (i > retry) { Console.WriteLine("微信提醒失败,请检查 SCKEY 是否填写正确"); } } // Create Warning Messagebox WarningMessageBox msg = new WarningMessageBox(share, warningType, lvi.SubItems[subitemIndex_DownPrice].Text, this); msg.Show(); } // Play sound warningdPlayer.Play(); } else { lvi.ForeColor = Color.Black; } } } // Update Infomation Panal if (Get2DisplayShareInfomationByCode(textBox_StockCode.Text)) { this.Text = Formtitle + " (Stock data has update: " + System.DateTime.Now.ToLongDateString() + " " + System.DateTime.Now.ToLongTimeString() + " )"; } else { this.Text = Formtitle + " (Request Error!)"; pictureBox_StockImage.Image = null; } if (--GCTimeFlow < 0) { GC.Collect(); GCTimeFlow = GCTime; } // Update notifyIcon text int bindCount = WarningMessageBox.getBindCount(); if (bindCount == 0) { notifyIcon1.Text = "当前无预警触发"; } else { notifyIcon1.Text = "当前有" + String.Concat(bindCount) + "条预警被触发!"; } }