Änderung am Apps Multichannelhandling
Hiho,
Aktuell ist es ja so => Jeder Channel startet jede zugewiesene App einmal je nach Anzahl Tochterchannel.
Die UserApps sollte die Multichannels komplett anders handhaben, dies würde die Auslastung der AppServer drastisch reduzieren und die Apps müssten nur noch einmal pro Channel (inkl. Subchannel) gestartet werden.
Eine Verlinkung innerhalb der appInstance von den einzelnen Channel-Objekten welche einfach alle Informationen zu allen SubChannels einschließt (z. B. KnuddelsServer.getAppAccess().getOwnInstance().getAllChannels() würde dann alle Channelinformation als Array zurückliefern), somit kann man diese problemlos durchlaufen und hat sogar beim AppStart alle Informationen aus allen SubChannels direkt greifbar auch KnuddelsServer.defaultBotUser sollte dann immer relativ zum getriggerten Channel gesetzt werden durch den AppServer. (Sollte MultiChannel in der app.config auf false oder nicht konfiguriert sein, werden einfach keine Events aus Tochterchannels an die App gesendet.)
Channel-Objekte müsste dann nur um getBotUser() erweitert werden um öffentliche Nachrichten gezielt in diesem Channel schreiben zu können.
Die Nutzerobjekte allgemein müssten um channel und getChannel() erweitert werden mit einer Verlinkung zu dem Channel in dem es ausgelöst wurde. Damit sind andere Dinge wie onUserJoined() oder onPublicMessage() etc. auch abgefangen und könnten mit user.getChannel().getBotUser().sendPublicMessage('öffentliche Antwort') gehandhabt werden. user.sendPrivateMessage() müsste dann über user.channel ablaufen um gezielt Privatnachrichten zu versenden. Dies würde das Event onAppEventReceived lediglich auf andere Apps reduzieren => weniger Kommunikation der Apps untereinander, weniger Auslastung im allgemeinen => mehr freie Resourcen für mehr Apps. UserAccess.getUserById() müsste dann immer das Nutzerobjekt relativ zum Channel des BotUsers zurückgeben, je nach getriggertem Event. AppContent müsste innerhalb des Channel verschoben werden um gezielte Instanzen wie aktuell zu handhaben.
Eine Einbindung, einer derartigen Änderung ist nicht mal eben so getan, dass ist mir schon bewusst, aber es würde sich für alle Seiten weitaus mehr lohnen. Entwickler hätten weniger Aufwand bei der Prüfung ob ein Nutzer vielleicht doch in einem SubChannel ist ohne permanent appEvents hin und her zu schubsen oder zu prüfen ob die App rootAppInstance ist (+ er hätte alle Informationen aus allen SubChannels direkt).
Wie gesagt für Knuddels wäre der Resourcenverbrauch pro App weitaus niedriger, das MultiChannelHandling wäre wesentlich einfacher und die Handhabung für jeden am Ende besser nachvollziehbar.
CodeBeispiel:
function sendToAllChannels(text) {
if (typeof text === 'string' && text) {
KnuddelsServer.getAppAccess().getOwnInstance().getAllChannels().forEach(function(channel){
// getBotUser() würde dann den BotUser mit Target = channel haben
channel.getBotUser().sendPublicMessage(text);
});
}
}
function getAllOnlineUsersByChannel() {
let result = {};
KnuddelsServer.getAppAccess().getOwnInstance().getAllChannels().forEach(function(channel){
let channelName = channel.getChannelName();
if (!result.hasOwnProperty(channelName)) {
result[channelName] = [];
channel.getOnlineUsers(UserType.Human).forEach(function(user){
result[channelName].push(user); // user von subChannel1 kann der gleiche user von subChannel 2 sein, wobei je user.channel dann dennoch eine Verlinkung auf dieses channelObjekt sein sollte.
});
}
});
return result;
}