using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using Church.Net.Utility; using LineMessaging; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using WebAPI.Logics; using WebAPI.Services; using static System.Net.Mime.MediaTypeNames; using WebAPI.Services.Interfaces; namespace WebAPI.Controllers { [ApiController] [Route("[controller]/[action]")] public class PingController : ControllerBase { private readonly IEnumerable autoReplyCommands; public PingController(VideoDownloadLogic videoDownloadLogic, IEnumerable autoReplyCommands) { VideoDownloadLogic = videoDownloadLogic; this.autoReplyCommands = autoReplyCommands; } public VideoDownloadLogic VideoDownloadLogic { get; } [HttpGet] public List GetEndpoints() { //using (var fileStream = new FileStream(ServerUtils.MapPath("Church/Test.mp4"), FileMode.Create)) //{ //} //await Task.Run(() => { //this.VideoDownloadLogic.Download(@"https://www.youtube.com/watch?v=nJBLeMrhu9w", @"\\ArkNAS\Church\Test.mp4"); //}); Console.WriteLine($"Self GetEndpoints: {DateTime.Now}"); string @namespace = this.GetType().Namespace; Type ApiControllerType = typeof(ControllerBase); IEnumerable controllers = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(s => s.GetTypes()) .Where(t => t.Namespace == @namespace && ApiControllerType.IsAssignableFrom(t)) ; HashSet baseMethods = new HashSet(ApiControllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance).Select(mi => mi.Name)); List _controllers = new List(); foreach (var controller in controllers) { Controller _controller = new Controller { Name = controller.Name.Replace("Controller", "") }; foreach (var methodInfo in controller.GetMethods(BindingFlags.Public | BindingFlags.Instance)) { if (baseMethods.Contains(methodInfo.Name)) continue; try { bool isGet = methodInfo.GetCustomAttributes(typeof(HttpGetAttribute), false).Length > 0; bool isPost = methodInfo.GetCustomAttributes(typeof(HttpPostAttribute), false).Length > 0; bool isDelete = methodInfo.GetCustomAttributes(typeof(HttpDeleteAttribute), false).Length > 0; if (isGet || isPost || isDelete) { Endpoint _endpoint = new Endpoint { Name = methodInfo.Name, Method = isGet ? "GET" : (isPost ? "POST" : (isDelete ? "DELETE" : "UNKNOWN")), Inputs = methodInfo.GetParameters().Select(m => new Input() { Name = m.Name }).ToArray(), ReturnType = methodInfo.ReturnType, //MethodInfo = methodInfo, }; //_endpoint.HasDocString = HasDocString(_endpoint); _controller.Endpoints.Add(_endpoint); } } catch (Exception ex) { } } _controllers.Add(_controller); } return _controllers; } [HttpGet] public async void TestMessage() { //\\ArkNAS\Church\WorshipVideo //this.VideoDownloadLogic.Download(@"https://www.youtube.com/watch?v=K2bdSYim7uI", @"\\ArkNAS\home\Test.mp4"); var test = new LineMessagingClient(); string text = "$$$$Menu Item"; var textMessage = new LineTextMessage() { Text = text, Emojis = new List() }; textMessage.AddEmoji("$$", "5ac1bfd5040ab15980c9b435", "002"); var templateMessage = new LineTemplateMessage(); var addPrayerBtn = new UriAction() { Uri = "https://happiness.tours/CellGroup/prayer?openExternalBrowser=1", Label = "Prayer" }; templateMessage.AltText = "代禱事項"; templateMessage.Template.DefaultAction = addPrayerBtn; templateMessage.Template.ThumbnailImageUrl = "https://dailyverses.net/images/tc/cuv/matthew-21-22-3.jpg"; templateMessage.Template.Title = "代禱事項"; templateMessage.Template.Text = "Chris" + Environment.NewLine + "Testwerewiorjowerjiowejiro, erjaiworjweiorjioawereaw"; templateMessage.Template.Actions = new List(); templateMessage.Template.Actions.Add(addPrayerBtn); await test.PushMessage(EnumHelper.EnumToDescriptionString(LineGroup.Chris), textMessage); } [HttpGet] public async void TestAutoReply(string command) { //\\ArkNAS\Church\WorshipVideo //this.VideoDownloadLogic.Download(@"https://www.youtube.com/watch?v=K2bdSYim7uI", @"\\ArkNAS\home\Test.mp4"); if (!String.IsNullOrWhiteSpace(command)) { string text = command; var group = LineGroup.Chris; var autoReply = autoReplyCommands.Where(ar => ar.SupportGroups.Contains(group) && ar.Commands.Contains(text)).FirstOrDefault(); if (autoReply != null) { if (autoReply.LineMessage != null) { ReplyLineMessage(group.EnumToDescriptionString(), autoReply.LineMessage); } else { // ReplyTextMessage(replyToken, autoReply.ReplyMessage); } return; } }; } [HttpGet] public string[] GetFiles(string path) { return Directory.GetFiles("/App_Data/" + path); } public class Controller { public string Name { get; set; } public List Endpoints { get; set; } = new List(); } public class Endpoint { public string Name { get; set; } public string Method { get; set; } public Input[] Inputs { get; set; } public Type ReturnType { get; set; } public MethodInfo MethodInfo { get; set; } public bool HasDocString { get; set; } } public partial class Input { public string Name { get; set; } public long Position { get; set; } } private async void ReplyLineMessage(string replyToken, IEnumerable lineMessages) { var test = new LineMessagingClient(); var replyMessage = new LinePushMessage() { To = replyToken }; replyMessage.Messages = lineMessages; await test.PushMessage(replyMessage); } } }