(Klick mich)
Das Jungfrauenspiel hat ein größeres Update erhalten. In diesem Update wurde da sogenannte Dashboard eingeführt, wie man es auch aus Facebook oder anderen Portalen kennt.
Im Großen und Ganzen ist es folgendermaßen technisch gelöst:
- Es gibt verschiedene Infogeneratoren. Diese registrieren sich beim Start des Jungfrauenspiels
- Jede dieser Infogeneratoren wird auf alle Informationen abgefragt. Da der FBK zu 100% im RAM läuft, geht dieser Vorgang schnell.
- Die Dashboard-Logik führt verschiedene Operationen aus um die Einträge zu filtern, zu sortieren und nur eine begrenzte Anzahl von Einträgen auszugeben.
- Ist all dies abgeschlossen, erhält der benutzerdefinierte Vorlage die Dashboard-Objekte und wandelt sie in Html-Code um.
Ein paar Quellcode-Schnipsel des schwarzen Bretts des Allianzsystem (Das Allianzsystem ist als reines Plugin konzipiert):
1) Registrierung von einem neuen Dashboard-Item
/// <summary>
/// This method is called, when logic core will be started
/// </summary>
/// <param name="logic">Logicinterface which created this state</param>
/// <param name="session">Current logic session</param>
public void Start(ILogic logic, ILogicSession session)
{
[…]
// Gets the dashboard state
var dashboardState = logic.GetLogicState<IDashboardState>();
var source = new AllianceDashboardItems();
dashboardState.AddSource(source);
}
2) Erzeugung von Dashboard-Items (in der AllianceDashboardItems-Klasse)
/// <summary>
/// Gets the dashboarditems by the dashboard logic
/// </summary>
/// <param name="dashboardLogic">Used logic of the dashboard</param>
/// <returns>Enumeration of items</returns>
private IEnumerable<DashboardItem> GetDashboardItems(
IDashboardLogic dashboardLogic)
{
var allianceSystem =
dashboardLogic.LogicSession.GetLogicHandler<IAllianceSystem>();
var languageHandler =
dashboardLogic.LogicSession.GetLogicHandler<ILanguageHandler>();
var playerId = dashboardLogic.PlayerLogic.PlayerId;
foreach (var alliance in allianceSystem.GetAlliancesOfPlayer(
playerId))
{
foreach (var item in alliance.GetPinboardEntries(playerId)
.Select(x => new DashboardItem(
languageHandler["/dashboard/alliance_pinboard/title"],
x.Content,
"alliance_pinboard",
x.Created)))
{
yield return item;
}
}
}
3) Sammlung von Dashboard-Items
/// <summary>
/// Gets the dashboarditems of the player
/// </summary>
/// <param name="amount">Number of items to be returned</param>
/// <returns>Enumeration of Dashboarditems</returns>
public IEnumerable<DashboardItem> GetDashboardItems(int amount)
{
// Now add items of all sources
return messages
.Union(
this.LogicState.Sources.SelectMany(x => x.Source(this)))
.OrderByDescending(x => x.Created)
.ThenBy(x=>x.Title)
.Take(amount);
}