mirror of
https://github.com/chsakell/aspnet-core-signalr-angular.git
synced 2025-12-22 17:27:48 +00:00
update match scores
This commit is contained in:
@@ -1,18 +1,31 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using AutoMapper;
|
||||||
using LiveGameFeed.Controllers;
|
using LiveGameFeed.Controllers;
|
||||||
using LiveGameFeed.Core.MvcTimer;
|
using LiveGameFeed.Core.MvcTimer;
|
||||||
|
using LiveGameFeed.Data.Abstract;
|
||||||
|
using LiveGameFeed.Data.Repositories;
|
||||||
using LiveGameFeed.Hubs;
|
using LiveGameFeed.Hubs;
|
||||||
|
using LiveGameFeed.Models;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.SignalR.Infrastructure;
|
using Microsoft.AspNetCore.SignalR.Infrastructure;
|
||||||
|
|
||||||
namespace ChatLe.Controllers
|
namespace LiveGameFeed.Controllers
|
||||||
{
|
{
|
||||||
public class HomeController : ApiHubController<Broadcaster>
|
public class HomeController : ApiHubController<Broadcaster>
|
||||||
{
|
{
|
||||||
|
IMatchRepository _matchRepository;
|
||||||
|
IFeedRepository _feedRepository;
|
||||||
|
|
||||||
|
private Object lockOb = new Object();
|
||||||
public HomeController(IConnectionManager signalRConnectionManager,
|
public HomeController(IConnectionManager signalRConnectionManager,
|
||||||
ITimerService timerService)
|
ITimerService timerService,
|
||||||
|
IMatchRepository matchRepository,
|
||||||
|
IFeedRepository feedRepository)
|
||||||
: base(signalRConnectionManager)
|
: base(signalRConnectionManager)
|
||||||
{
|
{
|
||||||
|
_matchRepository = matchRepository;
|
||||||
|
_feedRepository = feedRepository;
|
||||||
timerService.TimerElapsed += _feed_Generate;
|
timerService.TimerElapsed += _feed_Generate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,8 +38,74 @@ namespace ChatLe.Controllers
|
|||||||
{
|
{
|
||||||
TimerEventArgs eventsArgs = e as TimerEventArgs;
|
TimerEventArgs eventsArgs = e as TimerEventArgs;
|
||||||
System.Diagnostics.Debug.WriteLine("hello from home ApiHubController.cs..");
|
System.Diagnostics.Debug.WriteLine("hello from home ApiHubController.cs..");
|
||||||
|
lock (this.lockOb)
|
||||||
|
{
|
||||||
|
UpdateScores();
|
||||||
|
}
|
||||||
//await Clients.All.userConnected(DateTime.Now);
|
//await Clients.All.userConnected(DateTime.Now);
|
||||||
//_coolMessageHubContext.Clients.All.newCpuValue(eventsArgs.Value);
|
//_coolMessageHubContext.Clients.All.newCpuValue(eventsArgs.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void UpdateScores()
|
||||||
|
{
|
||||||
|
Random r = new Random();
|
||||||
|
bool updateHost = r.Next(0, 2) == 0;
|
||||||
|
|
||||||
|
IEnumerable<Match> matches = _matchRepository.GetAll();
|
||||||
|
|
||||||
|
foreach (var match in matches)
|
||||||
|
{
|
||||||
|
if (match.Type == MatchTypeEnums.Football)
|
||||||
|
{
|
||||||
|
if (updateHost)
|
||||||
|
{
|
||||||
|
match.HostScore++;
|
||||||
|
match.Feeds.Add(new Feed()
|
||||||
|
{
|
||||||
|
Description = "Goal for " + match.Host + "!",
|
||||||
|
CreatedAt = DateTime.Now,
|
||||||
|
MatchId = match.Id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
match.GuestScore++;
|
||||||
|
match.Feeds.Add(new Feed()
|
||||||
|
{
|
||||||
|
Description = "Goal for " + match.Guest + "!",
|
||||||
|
CreatedAt = DateTime.Now,
|
||||||
|
MatchId = match.Id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (match.Type == MatchTypeEnums.Basketball)
|
||||||
|
{
|
||||||
|
if (updateHost)
|
||||||
|
{
|
||||||
|
match.HostScore = match.HostScore + 2;
|
||||||
|
match.Feeds.Add(new Feed()
|
||||||
|
{
|
||||||
|
Description = "2 points for " + match.Host + "!",
|
||||||
|
CreatedAt = DateTime.Now,
|
||||||
|
MatchId = match.Id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
match.GuestScore = match.GuestScore + 2;
|
||||||
|
match.Feeds.Add(new Feed()
|
||||||
|
{
|
||||||
|
Description = "2 points for " + match.Guest + "!",
|
||||||
|
CreatedAt = DateTime.Now,
|
||||||
|
MatchId = match.Id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_matchRepository.Commit();
|
||||||
|
MatchViewModel _matchVM = Mapper.Map<Match, MatchViewModel>(match);
|
||||||
|
await Clients.All.updateMatch(_matchVM);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
25
Core/FeedGenerator.cs
Normal file
25
Core/FeedGenerator.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using LiveGameFeed.Models;
|
||||||
|
|
||||||
|
namespace LiveGameFeed.Core
|
||||||
|
{
|
||||||
|
public class FeedGenarator
|
||||||
|
{
|
||||||
|
public static Feed UpdateScore(Match match) {
|
||||||
|
Feed feed = new Feed();
|
||||||
|
feed.MatchId = match.Id;
|
||||||
|
|
||||||
|
if(match.Type == MatchTypeEnums.Football)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (match.Type == MatchTypeEnums.Basketball)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return feed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,8 @@ namespace LiveGameFeed.Core.Mappings
|
|||||||
{
|
{
|
||||||
protected override void Configure()
|
protected override void Configure()
|
||||||
{
|
{
|
||||||
Mapper.CreateMap<Match, MatchViewModel>();
|
Mapper.CreateMap<Match, MatchViewModel>()
|
||||||
|
.ForMember(m => m.Type, map => map.MapFrom(m => m.Type.ToString()));
|
||||||
Mapper.CreateMap<Feed, FeedViewModel>();
|
Mapper.CreateMap<Feed, FeedViewModel>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace LiveGameFeed.Data
|
|||||||
HostScore = 0,
|
HostScore = 0,
|
||||||
GuestScore = 0,
|
GuestScore = 0,
|
||||||
MatchDate = DateTime.Now,
|
MatchDate = DateTime.Now,
|
||||||
Type = "Football",
|
Type = MatchTypeEnums.Football,
|
||||||
Feeds = new List<Feed>
|
Feeds = new List<Feed>
|
||||||
{
|
{
|
||||||
new Feed()
|
new Feed()
|
||||||
@@ -45,7 +45,7 @@ namespace LiveGameFeed.Data
|
|||||||
HostScore = 0,
|
HostScore = 0,
|
||||||
GuestScore = 0,
|
GuestScore = 0,
|
||||||
MatchDate = DateTime.Now,
|
MatchDate = DateTime.Now,
|
||||||
Type = "Football",
|
Type = MatchTypeEnums.Football,
|
||||||
Feeds = new List<Feed>
|
Feeds = new List<Feed>
|
||||||
{
|
{
|
||||||
new Feed()
|
new Feed()
|
||||||
@@ -63,7 +63,7 @@ namespace LiveGameFeed.Data
|
|||||||
HostScore = 0,
|
HostScore = 0,
|
||||||
GuestScore = 0,
|
GuestScore = 0,
|
||||||
MatchDate = DateTime.Now,
|
MatchDate = DateTime.Now,
|
||||||
Type = "Basketball",
|
Type = MatchTypeEnums.Basketball,
|
||||||
Feeds = new List<Feed>
|
Feeds = new List<Feed>
|
||||||
{
|
{
|
||||||
new Feed()
|
new Feed()
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace LiveGameFeed.Models
|
|||||||
public int HostScore { get; set; }
|
public int HostScore { get; set; }
|
||||||
public int GuestScore { get; set; }
|
public int GuestScore { get; set; }
|
||||||
public DateTime MatchDate { get; set; }
|
public DateTime MatchDate { get; set; }
|
||||||
public string Type { get; set; }
|
public MatchTypeEnums Type { get; set; }
|
||||||
|
|
||||||
public ICollection<Feed> Feeds { get; set; }
|
public ICollection<Feed> Feeds { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
10
Models/MatchTypeEnum.cs
Normal file
10
Models/MatchTypeEnum.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace LiveGameFeed.Models
|
||||||
|
{
|
||||||
|
public enum MatchTypeEnums {
|
||||||
|
Football,
|
||||||
|
Basketball
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Startup.cs
11
Startup.cs
@@ -13,6 +13,7 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using LiveGameFeed.Core.Mappings;
|
using LiveGameFeed.Core.Mappings;
|
||||||
using LiveGameFeed.Core.MvcTimer;
|
using LiveGameFeed.Core.MvcTimer;
|
||||||
|
using Newtonsoft.Json.Serialization;
|
||||||
|
|
||||||
namespace LiveGameFeed
|
namespace LiveGameFeed
|
||||||
{
|
{
|
||||||
@@ -34,10 +35,9 @@ namespace LiveGameFeed
|
|||||||
public void ConfigureServices(IServiceCollection services)
|
public void ConfigureServices(IServiceCollection services)
|
||||||
{
|
{
|
||||||
services.AddDbContext<LiveGameContext>(options => options.UseInMemoryDatabase());
|
services.AddDbContext<LiveGameContext>(options => options.UseInMemoryDatabase());
|
||||||
|
|
||||||
// Repositories
|
// Repositories
|
||||||
services.AddScoped<IMatchRepository, MatchRepository>();
|
services.AddSingleton<IMatchRepository, MatchRepository>();
|
||||||
services.AddScoped<IFeedRepository, FeedRepository>();
|
services.AddSingleton<IFeedRepository, FeedRepository>();
|
||||||
|
|
||||||
// Timer service configuration
|
// Timer service configuration
|
||||||
services.AddSingleton<ITimerService, TimerService>();
|
services.AddSingleton<ITimerService, TimerService>();
|
||||||
@@ -47,7 +47,10 @@ namespace LiveGameFeed
|
|||||||
AutoMapperConfiguration.Configure();
|
AutoMapperConfiguration.Configure();
|
||||||
|
|
||||||
// Add framework services.
|
// Add framework services.
|
||||||
services.AddMvc();
|
services
|
||||||
|
.AddMvc()
|
||||||
|
.AddJsonOptions(options => options.SerializerSettings.ContractResolver =
|
||||||
|
new DefaultContractResolver());
|
||||||
|
|
||||||
services.AddSignalR(options => options.Hubs.EnableDetailedErrors = true);
|
services.AddSignalR(options => options.Hubs.EnableDetailedErrors = true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,16 @@ export class HomeComponent implements OnInit {
|
|||||||
this.dataService.getMatches()
|
this.dataService.getMatches()
|
||||||
.subscribe((res: Match[]) => {
|
.subscribe((res: Match[]) => {
|
||||||
self.matches = res;
|
self.matches = res;
|
||||||
console.log(self.matches);
|
self.feedService.updateMatch.subscribe(
|
||||||
|
match => {
|
||||||
|
for(var i=0; i< self.matches.length; i++)
|
||||||
|
{
|
||||||
|
if (self.matches[i].Id === match.Id) {
|
||||||
|
self.matches[i] = match;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
|
|||||||
@@ -7,16 +7,16 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class="teamName">{{match.host}}</span></td>
|
<td><span class="teamName">{{match.Host}}</span></td>
|
||||||
<td><span class="teamScore"> {{match.hostScore}} </span></td>
|
<td><span class="teamScore"> {{match.HostScore}} </span></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class="teamName"> {{match.guest}} </span></td>
|
<td><span class="teamName"> {{match.Guest}} </span></td>
|
||||||
<td><span class="teamScore">{{match.guestScore}}</span></td>
|
<td><span class="teamScore">{{match.GuestScore}}</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<span class="label label-success">{{match.type}}</span>
|
<span class="label label-success">{{match.Type}}</span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="button" class="btn btn-default btn-xs">
|
<button type="button" class="btn btn-default btn-xs">
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ export interface FeedProxy {
|
|||||||
export interface FeedClient {
|
export interface FeedClient {
|
||||||
userConnected: (user: any) => void;
|
userConnected: (user: any) => void;
|
||||||
userDisconnected: (id: string) => void;
|
userDisconnected: (id: string) => void;
|
||||||
|
|
||||||
|
updateMatch: (match: Match) => void;
|
||||||
messageReceived: (message: string) => void;
|
messageReceived: (message: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,12 +23,11 @@ export enum ConnectionState {
|
|||||||
|
|
||||||
/* LiveGameFeed related interfaces */
|
/* LiveGameFeed related interfaces */
|
||||||
export interface Match {
|
export interface Match {
|
||||||
id: number;
|
Id: number;
|
||||||
host: string;
|
Host: string;
|
||||||
guest: string;
|
Guest: string;
|
||||||
hostScore: number;
|
HostScore: number;
|
||||||
guestScore: number;
|
GuestScore: number;
|
||||||
matchDate: Date;
|
MatchDate: Date;
|
||||||
type: string;
|
Type: string;
|
||||||
feeds: any
|
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@ import 'rxjs/add/operator/toPromise';
|
|||||||
import { Observable } from "rxjs/Observable";
|
import { Observable } from "rxjs/Observable";
|
||||||
import { Subject } from "rxjs/Subject";
|
import { Subject } from "rxjs/Subject";
|
||||||
|
|
||||||
import { FeedSignalR, FeedProxy, FeedClient, ConnectionState } from '../interfaces';
|
import { FeedSignalR, FeedProxy, FeedClient, ConnectionState, Match } from '../interfaces';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FeedService {
|
export class FeedService {
|
||||||
@@ -13,15 +13,21 @@ export class FeedService {
|
|||||||
currentState = ConnectionState.Disconnected;
|
currentState = ConnectionState.Disconnected;
|
||||||
connectionState: Observable<ConnectionState>;
|
connectionState: Observable<ConnectionState>;
|
||||||
userConnected: Observable<any>;
|
userConnected: Observable<any>;
|
||||||
|
|
||||||
|
updateMatch: Observable<Match>;
|
||||||
messageReceived: Observable<string>;
|
messageReceived: Observable<string>;
|
||||||
|
|
||||||
private connectionStateSubject = new Subject<ConnectionState>();
|
private connectionStateSubject = new Subject<ConnectionState>();
|
||||||
private userConnectedSubject = new Subject<any>();
|
private userConnectedSubject = new Subject<any>();
|
||||||
|
|
||||||
|
private updateMatchSubject = new Subject<Match>();
|
||||||
private messageReceivedSubject = new Subject<string>();
|
private messageReceivedSubject = new Subject<string>();
|
||||||
|
|
||||||
constructor(private http: Http) {
|
constructor(private http: Http) {
|
||||||
this.connectionState = this.connectionStateSubject.asObservable();
|
this.connectionState = this.connectionStateSubject.asObservable();
|
||||||
this.userConnected = this.userConnectedSubject.asObservable();
|
this.userConnected = this.userConnectedSubject.asObservable();
|
||||||
|
|
||||||
|
this.updateMatch = this.updateMatchSubject.asObservable();
|
||||||
this.messageReceived = this.messageReceivedSubject.asObservable();
|
this.messageReceived = this.messageReceivedSubject.asObservable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +43,13 @@ export class FeedService {
|
|||||||
* @param User user, the connected user
|
* @param User user, the connected user
|
||||||
*/
|
*/
|
||||||
feedHub.client.userConnected = user => this.onUserConnected(user);
|
feedHub.client.userConnected = user => this.onUserConnected(user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc callback when a message is received
|
||||||
|
* @param String to, the conversation id
|
||||||
|
* @param Message data, the message
|
||||||
|
*/
|
||||||
|
feedHub.client.updateMatch = match => this.onUpdateMatch(match);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc callback when a message is received
|
* @desc callback when a message is received
|
||||||
@@ -83,6 +96,10 @@ export class FeedService {
|
|||||||
this.userConnectedSubject.next(user);
|
this.userConnectedSubject.next(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private onUpdateMatch(match: Match) {
|
||||||
|
this.updateMatchSubject.next(match);
|
||||||
|
}
|
||||||
|
|
||||||
private onMessageReceived(message: string) {
|
private onMessageReceived(message: string) {
|
||||||
console.log(message);
|
console.log(message);
|
||||||
this.messageReceivedSubject.next(message);
|
this.messageReceivedSubject.next(message);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"TimeService": {
|
"TimeService": {
|
||||||
"DueTime": 3000,
|
"DueTime": 6000,
|
||||||
"Period": 1500
|
"Period": 5000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user