LiterateInk / Pawnote

A purrfect API wrapper for PRONOTE.
https://docs.literate.ink/pawnote
GNU General Public License v3.0
55 stars 12 forks source link

feat: add notifications handler #46

Open Vexcited opened 4 months ago

Vexcited commented 4 months ago

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

image

Related PR on pronotepy : https://github.com/bain3/pronotepy/pull/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'
});
Orafilynie commented 4 months ago

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