send calendar list
This commit is contained in:
parent
f6fc258f57
commit
baad11c9fa
Binary file not shown.
Binary file not shown.
@ -1,7 +1,10 @@
|
|||||||
<h1>Calendar</h1>
|
<h1>Calendar</h1>
|
||||||
|
|
||||||
<p>This component demonstrates fetching data from the server.</p>
|
<div class="calendars" *ngIf="calendars">
|
||||||
<p *ngIf="!forecasts"><em>Loading...</em></p>
|
<div class="calendar" *ngFor="let calendar of calendars">
|
||||||
|
<a (click)="getCalendar(calendar.ChannelId)">{{calendar.Id}} ||{{calendar.ChannelId}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<table class='table table-striped' *ngIf="forecasts">
|
<table class='table table-striped' *ngIf="forecasts">
|
||||||
<thead>
|
<thead>
|
||||||
|
@ -7,25 +7,47 @@ import { HttpClient } from '@angular/common/http';
|
|||||||
})
|
})
|
||||||
export class CalendarComponent {
|
export class CalendarComponent {
|
||||||
public forecasts: CalendarForecast[];
|
public forecasts: CalendarForecast[];
|
||||||
|
public webSocket;
|
||||||
|
public calendars;
|
||||||
|
|
||||||
|
getCalendar(id) {
|
||||||
|
console.log("getCalendar: ", id);
|
||||||
|
this.webSocket.send('{Op: "calget", ChannelId: ' + id + '}');
|
||||||
|
}
|
||||||
|
|
||||||
|
handleCalendarList(cList) {
|
||||||
|
console.log("Setting calendars: ", cList);
|
||||||
|
this.calendars = cList;
|
||||||
|
};
|
||||||
|
|
||||||
constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
|
constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) {
|
||||||
|
var self = this;
|
||||||
console.log("ws connecting to ws" + baseUrl.substring(4, baseUrl.length) + "ws/calendar");
|
console.log("ws connecting to ws" + baseUrl.substring(4, baseUrl.length) + "ws/calendar");
|
||||||
var ws = new WebSocket("ws" + baseUrl.substring(4, baseUrl.length) + "ws/calendar");
|
this.webSocket = new WebSocket("ws" + baseUrl.substring(4, baseUrl.length) + "ws/calendar");
|
||||||
|
|
||||||
ws.onopen = function () {
|
|
||||||
|
|
||||||
// Web Socket is connected, send data using send()
|
|
||||||
ws.send('{op:"connect", gid: 98293701175955456, module:"calendar"}');
|
|
||||||
alert("Message is sent...");
|
|
||||||
|
|
||||||
|
this.webSocket.onopen = function () {
|
||||||
|
// TODO: Stop hardcoding gid, get this from url?
|
||||||
|
self.webSocket.send('{Op:"connect", GId: 98293701175955456, Module:"calendar"}');
|
||||||
|
setInterval(() => {
|
||||||
|
self.webSocket.send('{Op:"ping"}');
|
||||||
|
},120000);
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onmessage = function (evt) {
|
this.webSocket.onmessage = function (evt) {
|
||||||
var received_msg = evt.data;
|
console.log("evt: ", evt);
|
||||||
alert(received_msg);
|
var msg = JSON.parse(evt.data);
|
||||||
|
console.log(msg);
|
||||||
|
switch (msg.Op) {
|
||||||
|
case "CalendarList":
|
||||||
|
self.handleCalendarList(msg.Calendars);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log("Unknown opcode: ", msg);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onclose = function () {
|
this.webSocket.onclose = function () {
|
||||||
|
|
||||||
// websocket is closed.
|
// websocket is closed.
|
||||||
alert("Connection is closed...");
|
alert("Connection is closed...");
|
||||||
|
@ -11,5 +11,6 @@
|
|||||||
<li><strong>Angular CLI integration</strong>. In development mode, there's no need to run <code>ng serve</code>. It runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.</li>
|
<li><strong>Angular CLI integration</strong>. In development mode, there's no need to run <code>ng serve</code>. It runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.</li>
|
||||||
<li><strong>Efficient production builds</strong>. In production mode, development-time features are disabled, and your <code>dotnet publish</code> configuration automatically invokes <code>ng build</code> to produce minified, ahead-of-time compiled JavaScript files.</li>
|
<li><strong>Efficient production builds</strong>. In production mode, development-time features are disabled, and your <code>dotnet publish</code> configuration automatically invokes <code>ng build</code> to produce minified, ahead-of-time compiled JavaScript files.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
Dübbel Kalenderio
|
||||||
<app-calendar></app-calendar>
|
<app-calendar></app-calendar>
|
||||||
<p>The <code>ClientApp</code> subdirectory is a standard Angular CLI application. If you open a command prompt in that directory, you can run any <code>ng</code> command (e.g., <code>ng test</code>), or use <code>npm</code> to install extra packages into it.</p>
|
|
||||||
|
@ -30,25 +30,7 @@ namespace DiscoBot
|
|||||||
this.wsC = wsC;
|
this.wsC = wsC;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task Echo(HttpContext context, WebSocket webSocket)
|
public async Task HandleWebsocket(HttpContext context, TaskCompletionSource<object> tcs)
|
||||||
{
|
|
||||||
var buffer = new byte[1024 * 4];
|
|
||||||
|
|
||||||
WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
|
||||||
// Clientpaket handlen
|
|
||||||
// WebSocket an richtiges module zustellen
|
|
||||||
while (!result.CloseStatus.HasValue)
|
|
||||||
{
|
|
||||||
var msgBytes = Encoding.UTF8.GetBytes("penis");
|
|
||||||
Console.WriteLine(msgBytes);
|
|
||||||
await webSocket.SendAsync(new ArraySegment<byte>(msgBytes, 0, msgBytes.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);
|
|
||||||
|
|
||||||
result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
|
|
||||||
}
|
|
||||||
//await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task HandleWebsocket(HttpContext context)
|
|
||||||
{
|
{
|
||||||
Console.WriteLine("Handling Websocket to "+ context.Request.Path);
|
Console.WriteLine("Handling Websocket to "+ context.Request.Path);
|
||||||
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
|
WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
|
||||||
@ -59,7 +41,9 @@ namespace DiscoBot
|
|||||||
{
|
{
|
||||||
if (m.Name == login.Module)
|
if (m.Name == login.Module)
|
||||||
{
|
{
|
||||||
m.OnNewWebSocket(webSocket);
|
#pragma warning disable CS4014 // Da auf diesen Aufruf nicht gewartet wird, wird die Ausführung der aktuellen Methode vor Abschluss des Aufrufs fortgesetzt.
|
||||||
|
m.OnNewWebSocketAsync(webSocket, tcs);
|
||||||
|
#pragma warning restore CS4014 // Da auf diesen Aufruf nicht gewartet wird, wird die Ausführung der aktuellen Methode vor Abschluss des Aufrufs fortgesetzt.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,6 +58,13 @@ namespace DiscoBot
|
|||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async void SendStringViaWebSocket(WebSocket ws, string str)
|
||||||
|
{
|
||||||
|
var msgBytes = Encoding.UTF8.GetBytes(str);
|
||||||
|
Console.WriteLine("Sending: "+str);
|
||||||
|
await ws.SendAsync(new ArraySegment<byte>(msgBytes, 0, msgBytes.Length), WebSocketMessageType.Text, true, CancellationToken.None);
|
||||||
|
}
|
||||||
|
|
||||||
public async void Initialize()
|
public async void Initialize()
|
||||||
{
|
{
|
||||||
Console.WriteLine("In init!");
|
Console.WriteLine("In init!");
|
||||||
|
@ -12,6 +12,6 @@ namespace DiscoBot
|
|||||||
Dictionary<string,Func<SocketMessage, string[], Task>> Commands { get; set; }
|
Dictionary<string,Func<SocketMessage, string[], Task>> Commands { get; set; }
|
||||||
string Name { get; set; }
|
string Name { get; set; }
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void OnNewWebSocket(WebSocket ws);
|
Task OnNewWebSocketAsync(WebSocket ws, TaskCompletionSource<object> tcs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using Microsoft.AspNetCore;
|
|||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Microsoft.Extensions.Logging.Console;
|
||||||
|
|
||||||
namespace DiscoBot
|
namespace DiscoBot
|
||||||
{
|
{
|
||||||
|
@ -6,6 +6,7 @@ using Microsoft.AspNetCore.SpaServices.AngularCli;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.WebSockets;
|
using System.Net.WebSockets;
|
||||||
@ -31,6 +32,7 @@ namespace DiscoBot
|
|||||||
services.AddMvc()
|
services.AddMvc()
|
||||||
.AddNewtonsoftJson();
|
.AddNewtonsoftJson();
|
||||||
|
|
||||||
|
|
||||||
// In production, the Angular files will be served from this directory
|
// In production, the Angular files will be served from this directory
|
||||||
services.AddSpaStaticFiles(configuration =>
|
services.AddSpaStaticFiles(configuration =>
|
||||||
{
|
{
|
||||||
@ -75,7 +77,9 @@ namespace DiscoBot
|
|||||||
{
|
{
|
||||||
if (context.WebSockets.IsWebSocketRequest)
|
if (context.WebSockets.IsWebSocketRequest)
|
||||||
{
|
{
|
||||||
await diBot.HandleWebsocket(context);
|
var socketFinishedTcs = new TaskCompletionSource<object>();
|
||||||
|
await diBot.HandleWebsocket(context, socketFinishedTcs);
|
||||||
|
await socketFinishedTcs.Task;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -107,7 +111,7 @@ namespace DiscoBot
|
|||||||
|
|
||||||
if (env.IsDevelopment())
|
if (env.IsDevelopment())
|
||||||
{
|
{
|
||||||
spa.UseAngularCliServer(npmScript: "start");
|
spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
{
|
{
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Warning"
|
"Default": "Information",
|
||||||
}
|
"Microsoft.AspNetCore": "Warning"
|
||||||
},
|
},
|
||||||
|
"Console": {
|
||||||
|
"IncludeScopes": true
|
||||||
|
}
|
||||||
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*"
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,7 @@ namespace DiscoBot.calendar
|
|||||||
[HttpGet("{guild}", Name = "Get")]
|
[HttpGet("{guild}", Name = "Get")]
|
||||||
public JsonResult Get(ulong guild)
|
public JsonResult Get(ulong guild)
|
||||||
{
|
{
|
||||||
CalendarContext calendarContext = new CalendarContext(guild);
|
return Json("");
|
||||||
List<CalendarItem> items = calendarContext.CalendarItems.Include(i => i.Attendance).ToList();
|
|
||||||
return Json(items);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// POST: api/Cal
|
// POST: api/Cal
|
||||||
|
@ -5,6 +5,8 @@ using System.Net.WebSockets;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace DiscoBot.calendar
|
namespace DiscoBot.calendar
|
||||||
{
|
{
|
||||||
@ -32,10 +34,44 @@ namespace DiscoBot.calendar
|
|||||||
Console.WriteLine("Initializing calendar...");
|
Console.WriteLine("Initializing calendar...");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnNewWebSocket(WebSocket ws)
|
public async Task OnNewWebSocketAsync(WebSocket ws, TaskCompletionSource<object> tcs)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Calendar " + guild.Id + " has a new websocket.");
|
Console.WriteLine("Calendar " + guild.Id + " has a new websocket.");
|
||||||
webSockets.Add(ws);
|
webSockets.Add(ws);
|
||||||
|
// Send list of calendars(channels)
|
||||||
|
//var calendar = calendarContext.ChannelCalendar.Include(cal => cal.Items).ToList();
|
||||||
|
var cList = new CalendarList();
|
||||||
|
cList.Calendars = calendarContext.ChannelCalendar.ToList();
|
||||||
|
string str = JsonConvert.SerializeObject(cList);
|
||||||
|
Console.WriteLine(str);
|
||||||
|
DisBot.SendStringViaWebSocket(ws, str);
|
||||||
|
#pragma warning disable CS4014 // Da auf diesen Aufruf nicht gewartet wird, wird die Ausführung der aktuellen Methode vor Abschluss des Aufrufs fortgesetzt.
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
Console.WriteLine("Starting websocket handling...");
|
||||||
|
while (ws.State != WebSocketState.Closed)
|
||||||
|
{
|
||||||
|
string msg = await DisBot.ReadOneStringFromWebSocket(ws);
|
||||||
|
var op = JsonConvert.DeserializeObject<Opcode>(msg);
|
||||||
|
switch (op.Op)
|
||||||
|
{
|
||||||
|
case "calget":
|
||||||
|
var calGet = JsonConvert.DeserializeObject<CalGet>(msg);
|
||||||
|
Console.WriteLine("ChannelID:" + calGet.ChannelId);
|
||||||
|
var calendarWS = new CalendarWS();
|
||||||
|
var temp = calendarContext.ChannelCalendar.FirstOrDefault();
|
||||||
|
calendarWS.Op = calGet.Op;
|
||||||
|
DisBot.SendStringViaWebSocket(ws, JsonConvert.SerializeObject(calendarWS));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Unknown opcode: " + op.Op);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.WriteLine("Websocket handling stopped...");
|
||||||
|
tcs.TrySetResult(new object());
|
||||||
|
});
|
||||||
|
#pragma warning restore CS4014 // Da auf diesen Aufruf nicht gewartet wird, wird die Ausführung der aktuellen Methode vor Abschluss des Aufrufs fortgesetzt.
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task HandleTestCommand(SocketMessage msg, string[] parameters)
|
private Task HandleTestCommand(SocketMessage msg, string[] parameters)
|
||||||
@ -56,6 +92,14 @@ namespace DiscoBot.calendar
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var gchan = msg.Channel as IGuildChannel;
|
var gchan = msg.Channel as IGuildChannel;
|
||||||
|
var calendar = calendarContext.ChannelCalendar.FirstOrDefault(cal => cal.ChannelId == gchan.Id);
|
||||||
|
if(calendar == null)
|
||||||
|
{
|
||||||
|
calendar = new ChannelCalendar();
|
||||||
|
calendar.ChannelId = gchan.Id;
|
||||||
|
calendar.Moderated = false;
|
||||||
|
calendarContext.Add(calendar);
|
||||||
|
}
|
||||||
string name = parameters[1];
|
string name = parameters[1];
|
||||||
string date = parameters[2];
|
string date = parameters[2];
|
||||||
string comment = parameters[3];
|
string comment = parameters[3];
|
||||||
@ -70,8 +114,9 @@ namespace DiscoBot.calendar
|
|||||||
attendance.Attendee = msg.Author.Id;
|
attendance.Attendee = msg.Author.Id;
|
||||||
attendance.Attending = Attendance.Attending;
|
attendance.Attending = Attendance.Attending;
|
||||||
calItem.Attendance.Add(attendance);
|
calItem.Attendance.Add(attendance);
|
||||||
calendarContext.CalendarItems.Add(calItem);
|
calendar.Items.Add(calItem);
|
||||||
calendarContext.SaveChanges();
|
calendarContext.SaveChanges();
|
||||||
|
msg.Channel.SendMessageAsync("Event "+ calItem.Name + " has been added.");
|
||||||
}
|
}
|
||||||
catch(FormatException)
|
catch(FormatException)
|
||||||
{
|
{
|
||||||
|
@ -11,8 +11,7 @@ namespace DiscoBot.calendar
|
|||||||
public class CalendarContext : DbContext
|
public class CalendarContext : DbContext
|
||||||
{
|
{
|
||||||
private ulong guildId;
|
private ulong guildId;
|
||||||
public DbSet<CalendarItem> CalendarItems { get; set; }
|
public DbSet<ChannelCalendar> ChannelCalendar { get; set; }
|
||||||
|
|
||||||
public CalendarContext(ulong guildId)
|
public CalendarContext(ulong guildId)
|
||||||
{
|
{
|
||||||
this.guildId = guildId;
|
this.guildId = guildId;
|
||||||
@ -24,6 +23,15 @@ namespace DiscoBot.calendar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ChannelCalendar
|
||||||
|
{
|
||||||
|
[Key]
|
||||||
|
public ulong Id { get; set; }
|
||||||
|
public ulong ChannelId { get; set; }
|
||||||
|
public List<CalendarItem> Items { get; set; } = new List<CalendarItem>();
|
||||||
|
public bool Moderated { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class CalendarItemAttendance
|
public class CalendarItemAttendance
|
||||||
{
|
{
|
||||||
[Key]
|
[Key]
|
||||||
|
@ -5,10 +5,37 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace DiscoBot.calendar
|
namespace DiscoBot.calendar
|
||||||
{
|
{
|
||||||
|
public class Opcode
|
||||||
|
{
|
||||||
|
public string Op { get; set; }
|
||||||
|
}
|
||||||
public class Login {
|
public class Login {
|
||||||
// {op:"connect", gid: 324984732895, module:"calendar"}
|
// {Op:"connect", GId: 324984732895, Module:"calendar"}
|
||||||
public string Op { get; set; }
|
public string Op { get; set; }
|
||||||
public ulong Gid { get; set; }
|
public ulong Gid { get; set; }
|
||||||
public string Module { get; set; }
|
public string Module { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CalendarList
|
||||||
|
{
|
||||||
|
// {Op: "CalendarList, Calendars: []}
|
||||||
|
public string Op { get; set; }
|
||||||
|
public List<ChannelCalendar> Calendars { get; set; }
|
||||||
|
public CalendarList()
|
||||||
|
{
|
||||||
|
this.Op = "CalendarList";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class CalendarWS
|
||||||
|
{
|
||||||
|
public string Op { get; set; }
|
||||||
|
public ChannelCalendar Calendar { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CalGet
|
||||||
|
{
|
||||||
|
// {Op:"calget", ChannelId: 239180890231}
|
||||||
|
public string Op { get; set; }
|
||||||
|
public ulong ChannelId { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,10 @@ namespace DiscoBot.rss
|
|||||||
Console.WriteLine("Found feed " + feed.Name);
|
Console.WriteLine("Found feed " + feed.Name);
|
||||||
Timer timer = new Timer(feed.CheckInterval.TotalMilliseconds);
|
Timer timer = new Timer(feed.CheckInterval.TotalMilliseconds);
|
||||||
timer.AutoReset = true;
|
timer.AutoReset = true;
|
||||||
timer.Elapsed += async (sender, e) => await HandleFeedCheck(feed);
|
timer.Elapsed += async (sender, e) =>
|
||||||
|
{
|
||||||
|
await Task.Run(() => HandleFeedCheck(feed));
|
||||||
|
};
|
||||||
timer.Start();
|
timer.Start();
|
||||||
timers.Add(feed.Name, timer);
|
timers.Add(feed.Name, timer);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
@ -208,7 +211,7 @@ namespace DiscoBot.rss
|
|||||||
Console.WriteLine("Initializing rss...");
|
Console.WriteLine("Initializing rss...");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnNewWebSocket(WebSocket ws)
|
public async Task OnNewWebSocketAsync(WebSocket ws, TaskCompletionSource<object> tcs)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Calendar " + guild.Id + " has a new websocket.");
|
Console.WriteLine("Calendar " + guild.Id + " has a new websocket.");
|
||||||
webSockets.Add(ws);
|
webSockets.Add(ws);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user