Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add notifications handler #46

Open
Vexcited opened this issue Jul 4, 2024 · 1 comment
Open

feat: add notifications handler #46

Vexcited opened this issue Jul 4, 2024 · 1 comment
Assignees
Labels
core Related to 'pawnote' crate itself. enhancement New feature or request

Comments

@Vexcited
Copy link
Member

Vexcited commented Jul 4, 2024

Create a handler in the client to access data from this menu.

image

Related PR on pronotepy : bain3/pronotepy#288


request

{
  "session": 1261072,
  "numeroOrdre": "c0169622e638d173cc1245a582ae5a4f",
  "nom": "CentraleNotifications",
  "donneesSec": {
    "_Signature_": {
      "onglet": 7 // current active onglet, could be any 
    }
  }
}

response data

{
  "donnees": {
    "liste": {
      "_T": 24,
      "V": [
        {
          "L": "Sécurité",
          "ident": "secSecurite",
          "liste": {
            "_T": 24,
            "V": [
              {
                "type": 1,
                "action": 0,
                "date": {
                  "_T": 7,
                  "V": "04/07/2024 22:41:03"
                },
                "id": "not_app_5_FA2949486DC7B572D796718B89343531",
                "titre": {
                  "_T": 21,
                  "V": "Opérations sur votre compte PRONOTE"
                },
                "message": {
                  "_T": 21,
                  "V": "Le 04/07/2024 à 22:41, suite à une modification de la politique de sécurité de l'établissement par votre administrateur, la politique de sécurité de votre compte a été modifiée.<br />  - personnalisation de votre mot de passe"
                },
                "compteur": 1,
                "modalites": {
                  "_T": 26,
                  "V": "[0]"
                },
                "dateExpiration": {
                  "_T": 7,
                  "V": "11/07/2024 22:41:03"
                },
                "onBtnClick": true
              }
            ]
          }
        }
      ]
    },
    "nbNotifs": 1
  },
  "nom": "CentraleNotifications"
}

javascript builder

_construireListeNotifications(aSection, aIndexSection, aAfficherHistorique) {
  const H = [];
  aSection.liste.parcourir((aNotification,aIndexNotif)=>{
    const lEstHistorique = aNotification.modalites.contains(TypeCentraleNotifications_1.TypeModaliteAffichage.affHistorique);
    if ((aAfficherHistorique && !lEstHistorique) || (!aAfficherHistorique && lEstHistorique)) {
      return;
    }
    let lBoutonCoin = '';
    let lAvecActionArticle = false;
    switch (aNotification.action) {
    case TypeCentraleNotifications_1.TypeActionBoutonNotif.abnLien:
      lBoutonCoin = '<i class="sc_btnCoin icon_affichage_widget"></i>';
      lAvecActionArticle = true;
      break;
    case TypeCentraleNotifications_1.TypeActionBoutonNotif.abnLu:
      if (!aAfficherHistorique) {
        lBoutonCoin = ['<ie-btnimage class="sc_btnCoin btnImageIcon icon_eye_close"', ' title="', ObjetTraduction_1.GTraductions.getValeur('CentraleNotifications.MarquerLu'), '"', ObjetHtml_1.GHtml.composeAttr('ie-model', 'btnNotifCoin', [aIndexSection, aIndexNotif]), '></ie-btnimage>'].join('');
      }
      break;
    case TypeCentraleNotifications_1.TypeActionBoutonNotif.abnFermer:
      lBoutonCoin = ['<ie-btnimage class="sc_btnCoin btnImageIcon icon_fermeture_widget"', ' title="', ObjetTraduction_1.GTraductions.getValeur('Fermer'), '"', ObjetHtml_1.GHtml.composeAttr('ie-model', 'btnNotifCoin', [aIndexSection, aIndexNotif]), '></ie-btnimage>'].join('');
      break;
    }
    const lClasses = [];
    if (lAvecActionArticle) {
      lClasses.push('sc_article_action', 'ie-ripple');
    }
    if (aAfficherHistorique) {
      lClasses.push('sc_article_histo');
    }
    H.push('<article tabindex="0"', (lClasses.length > 0 ? ' class="' + lClasses.join(' ') + '"' : ''), (lAvecActionArticle ? ObjetHtml_1.GHtml.composeAttr('ie-node', 'getNodeNotif', [aIndexSection, aIndexNotif, aNotification.id]) : ''), '>', lBoutonCoin, '<div class="sc_article_gauche">', _contruireEtiquetteArticle(aNotification), '</div>', '<div class="sc_article_contenu">', aNotification.titre ? '<div class="sc_article_contenu_titre' + (lBoutonCoin ? ' sc_article_contenu_titre_avecBtn' : '') + '">' + aNotification.titre + '</div>' : '', '<div ie-node="getNodeMessage">', aNotification.message, '</div>', aNotification.dateLue ? _construireDateLue(aNotification) : '', aNotification.dateExpiration && lEstHistorique ? _construireDateExpiration(aNotification) : '', '</div>', '</article>');
  }
  );
  return H.join('');
}

enums

;IE.fModule({
  f: function(exports, require, module, global) {
    "use strict";
    Object.defineProperty(exports, "__esModule", {
      value: true
    });
    exports.TypeModaliteAffichage = exports.TypeActionBoutonNotif = exports.TypeNotification = void 0;
    var TypeNotification;
    (function(TypeNotification) {
      TypeNotification[TypeNotification["nOrpheline"] = 0] = "nOrpheline";
      TypeNotification[TypeNotification["nUnique"] = 1] = "nUnique";
      TypeNotification[TypeNotification["nCompteur"] = 2] = "nCompteur";
      TypeNotification[TypeNotification["nRouleau"] = 3] = "nRouleau";
    }
    )(TypeNotification || (exports.TypeNotification = TypeNotification = {}));
    var TypeActionBoutonNotif;
    (function(TypeActionBoutonNotif) {
      TypeActionBoutonNotif[TypeActionBoutonNotif["abnLu"] = 0] = "abnLu";
      TypeActionBoutonNotif[TypeActionBoutonNotif["abnFermer"] = 1] = "abnFermer";
      TypeActionBoutonNotif[TypeActionBoutonNotif["abnLien"] = 2] = "abnLien";
      TypeActionBoutonNotif[TypeActionBoutonNotif["abnNoAction"] = 3] = "abnNoAction";
    }
    )(TypeActionBoutonNotif || (exports.TypeActionBoutonNotif = TypeActionBoutonNotif = {}));
    var TypeModaliteAffichage;
    (function(TypeModaliteAffichage) {
      TypeModaliteAffichage[TypeModaliteAffichage["affZone"] = 0] = "affZone";
      TypeModaliteAffichage[TypeModaliteAffichage["affHistorique"] = 1] = "affHistorique";
      TypeModaliteAffichage[TypeModaliteAffichage["affModale"] = 2] = "affModale";
      TypeModaliteAffichage[TypeModaliteAffichage["affPopup"] = 3] = "affPopup";
    }
    )(TypeModaliteAffichage || (exports.TypeModaliteAffichage = TypeModaliteAffichage = {}));
  },
  fn: 'typecentralenotifications.js'
});
@Vexcited Vexcited added the enhancement New feature or request label Jul 4, 2024
@Vexcited Vexcited added this to the 0.22.0 milestone Jul 4, 2024
@Vexcited Vexcited self-assigned this Jul 4, 2024
@Vexcited Vexcited changed the title add notifications handler feat: add notifications handler Jul 4, 2024
@Orafilynie
Copy link

Dans mes recherches, j'ai obtenue la réponse si dessous avec une notification de "Communication" :

{
    "nom": "CentraleNotifications",
    "session": 9587159,
    "numeroOrdre": "EB6CD6F215D6638D1E298FFECB666021",
    "donneesSec": {
        "donnees": {
            "liste": {
                "_T": 24,
                "V": [
                    {
                        "L": "Communication",
                        "ident": "secMessagerie",
                        "liste": {
                            "_T": 24,
                            "V": [
                                {
                                    "type": 2,
                                    "action": 2,
                                    "id": "Informations",
                                    "titre": {
                                        "_T": 21,
                                        "V": ""
                                    },
                                    "message": {
                                        "_T": 21,
                                        "V": "Informations et sondages"
                                    },
                                    "compteur": 1,
                                    "modalites": {
                                        "_T": 26,
                                        "V": "[0]"
                                    }
                                }
                            ]
                        }
                    }
                ]
            },
            "nbNotifs": 1
        },
        "nom": "CentraleNotifications"
    }
}

On y trouve dedans :

  "type": 2,
  "action": 2,

Avec ces données par exemple, j'en déduis que le navigateur, adapte donc le type de notification à afficher grâce au javascript des enums trouvé par Vexcited, donc dans notre cas, c'est pour le type :

  TypeNotification[TypeNotification["nCompteur"] = 2] = "nCompteur";

Cette ligne permettra au navigateur de savoir qu'il aura a chercher un chiffre pour afficher un compteur de notifications, car pour les news, les notifications se "stackent", donc dans la réponse, on trouve aussi donc :

  "compteur": 1,

Le navigateur, sachant qu'il devra donc afficher un chiffre, le récupère ici, et l'affiche tel quel (je ne sais pas a ce niveau si le javascript builder agit afin de l'afficher car il ne contient pour l'instant que les instructions pour gérer les actions dont on va parler plus bas) :

Capture d’écran 2024-07-09 120400

Ensuite, le navigateur devra pouvoir proposer une action à l'utilisateur, il commencera avec la réponse à savoir quel action il devra afficher, qui est dans notre cas :

  "action": 2,

Maintenant que le navigateur sais a quel type d'action il à affaire, il va attribuer une propriété, qui est abn[ACTION], grâce au javascript enums, dont la ligne est dans notre cas :

  TypeActionBoutonNotif[TypeActionBoutonNotif["abnLien"] = 2] = "abnLien";

Puis à ce stade, le builder va donc s'occuper de modifier l'html pour afficher l'action approprié, qui dans notre cas se fait avec la propriété "abnLien", donc :

  case TypeCentraleNotifications_1.TypeActionBoutonNotif.abnLien:
      lBoutonCoin = '<i class="sc_btnCoin icon_affichage_widget"></i>';
      lAvecActionArticle = true;
      break;

Il va donc s'occuper d'afficher dans le HTML le bouton correspondant sur la notification, qui est dans notre cas une "redirection" :

Capture d’écran 2024-07-09 121241

Maintenant, si on s'attaque au cas de la réponse de Vexcited, qui présente une notification de sécurité, on obtient dans la réponse :

  "type": 1,
  "action": 0,

Et si on reproduit les mêmes actions que dessus, on tombe donc sur le javascript des enums pour le type :

  TypeNotification[TypeNotification["nUnique"] = 1] = "nUnique";

Qui est une notification unique et donc pas "stackable" comme la précédente, et donc evidémment ne possède pas de compteur dans la réponse, puis si on se penche du coté action, on tombe dans le javascript des enums sur :

  TypeActionBoutonNotif[TypeActionBoutonNotif["abnLu"] = 0] = "abnLu";

Qui est donc l'action lire, que le javascript builder, grâce à la propriété "abnLu", doit executer :

   case TypeCentraleNotifications_1.TypeActionBoutonNotif.abnLu:
      if (!aAfficherHistorique) {
        lBoutonCoin = ['<ie-btnimage class="sc_btnCoin btnImageIcon icon_eye_close"', ' title="', ObjetTraduction_1.GTraductions.getValeur('CentraleNotifications.MarquerLu'), '"', ObjetHtml_1.GHtml.composeAttr('ie-model', 'btnNotifCoin', [aIndexSection, aIndexNotif]), '></ie-btnimage>'].join('');
      }
      break;

Le navigateur sait donc qu'il doit placer le bouton lire et donne :

Capture d’écran 2024-07-09 121735

@Vexcited Vexcited modified the milestones: 0.22.0, 1.1.0 Jul 10, 2024
@Vexcited Vexcited added the core Related to 'pawnote' crate itself. label Jul 17, 2024
@Vexcited Vexcited modified the milestones: 1.1.0, 1.2.0 Aug 28, 2024
@Vexcited Vexcited removed this from the 1.2.0 milestone Sep 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Related to 'pawnote' crate itself. enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants