[18] 登入後将用户资料纪录

建立资料中心後,更改登入功能

再登入後将用户资料记录在案

变更 dataCenter 对应的 action

dataCenter.js

const GetInstanceClass = require("./component/GetInstanceClass");
/**
 * @description 资料都存在这边
 *
 * @class DataCenter
 */
class DataCenter extends GetInstanceClass {
  constructor() {
    super();

    this.state = {
      user: {
        id: "X",
        username: "X",
        name: "游客"
      }
    };
  }

  /**
   * @description 获取对应资料
   *
   * @param {string} key
   * @return {any} state data
   * @memberof DataCenter
   */
  getData(key) {
    switch (key) {
      case "user":
        return this.state["user"];
      default:
        break;
    }
  }

  /**
   * @description 设定 state 资料
   *
   * @param {string} key
   * @param {any} data state data
   * @memberof DataCenter
   */
  setData(key, data) {
    switch (key) {
      case "setUser":
        this.state["user"] = data;
        break;
      default:
        break;
    }
  }

  /**
   * @description 订阅资料变更後要执行的程序,先预留到时候再写
   *
   * @param {string} key state data
   * @param {function} callBack
   * @memberof DataCenter
   */
  subscription(key, callBack) {

  }
}

let dataCenter = DataCenter.getInstance();

module.exports = dataCenter;

接着更改 telegram 对应的 login 函式

interface\telegramItem.js

const { TelegramClient } = require("telegram");
const { StringSession } = require("telegram/sessions");
const { Logger } = require("telegram/extensions");

const input = require("input");

const GetInstanceClass = require("../component/GetInstanceClass");
const dataCeneter = require("../dataCenter");

Logger.setLevel("none"); // 这边可以隐藏很多关於 telegram 的运作细节

class TelegramItem extends GetInstanceClass {
  constructor() {
    super();
    this.client = null;
  }

  /**
   * @description 初始化 telegram 实体
   *
   * @memberof TelegramItem
   */
  init() {
    this.client = new TelegramClient(
      new StringSession(""),
      Number(process.env.telegramId), // 这边输入你的 id
      process.env.telegramHash, // 输入你的 hash
      { connectionRetries: 5 }
    );
  }

  /**
   * @description 登入 telegram
   *
   * @return {*}
   * @memberof TelegramClass
   */
  async login() {
    await this.client.start({
      phoneNumber: async () => await input.text("请输入电话?"),
      password: async () => await input.text("请输入密码?"),
      phoneCode: async () => await input.text("请输入验证码?"),
      onError: (err) => console.log("错误讯息 : " + err.errorMessage),
    });

    // console.log(); // Save this string to avoid logging in again

    console.log("");
    console.log("\x1b[36m", "成功登入");
    console.log();
    let user = await this.client.getMe();
    dataCeneter.setData("setUser", {
      id: user.id,
      username: user.username,
      name: user.lastName + user.firstName
    })
    this.client.session.save();
    // 登入成功寄给你的 telegram 一个讯息
    await this.client.sendMessage("me", {
      message: "node sevret is online! " + new Date().toLocaleString(),
    });

    return true;
  }
}

const telegramItem = TelegramItem.getInstance();

telegramItem.init();

module.exports = telegramItem;

然後更改你好前面对应的名称

view\viewPrinter.js

const consoleItem = require("../interface/consoleItem");
const input = require("input");
const GetInstanceClass = require("../component/GetInstanceClass");

const dataCenter = require("../dataCenter");

class ViewPrinter extends GetInstanceClass{
  constructor() {
    super();
  }

  /**
   * @description 欢迎你
   *
   * @memberof ViewPrinter
   */
  async welcome() {
    return new Promise((resolve) => {
      let str = [
        "=======================================================",
        "=======================================================",
        "============                               ============",
        "============     Welcome Node Telegram     ============",
        "============                               ============",
        "=======================================================",
        "=======================================================",
      ];
      console.log("\x1b[36m");
      for (let i = 0; i < str.length; i++) {
        setTimeout(() => {
          console.log(str[i]);
          if (i === str.length - 1) {
            console.log("\x1b[0m");
            resolve();
          }
        }, i * 100);
      }
    });
  }

  /**
   * @description 主要画面选单
   *
   * @memberof ViewPrinter
   */
  async mainMenu() {
    let option = ["登入", "离开"];

    let selectOption = await input.select(dataCenter.getData("user").name + " 你好:", option);

    return selectOption;
  }

  /**
   * @description 按下去任何按键来继续程序
   *
   * @return {*}
   * @memberof InterfaceClass
   */
  async pressToContinue() {
    return new Promise((resolve) => {
      const handler = () => {
        process.stdin.setRawMode(false);
        process.stdin.pause();
        process.stdout.write("\n");
        resolve();
      };

      process.stdin.resume();
      process.stdin.setRawMode(true);
      process.stdin.once("data", handler);
    });
  }

  /**
   * @description 清空画面
   *
   * @memberof ViewPrinter
   */
  async clearView() {
    process.stdout.write(
      process.platform === "win32" ? "\x1Bc" : "\x1B[2J\x1B[3J\x1B[H"
    );
  }
}

let viewPrinter = ViewPrinter.getInstance();

module.exports = viewPrinter;

这样就有登入记忆 user 的功能了

day18


<<:  Day 22 UICollectionView的练习 (2/2)

>>:  [day22] 快速产生测试资料

[day14] 接收使用者的Line讯息

结合先前的 产生channel access token 设定heroku 可以开始建立一个服务器接...

全端开发者必懂的「产品设计」——全端开发者内功 IV

from Unsplash 为什麽工程师也要懂产品设计? 前面笔记提过,现代科技秒新分异、资讯爆炸...

WordPress 如何使用 MailerLite 发送电子报教学-提高读者回访率

当我们在网站定期更新有价值的内容时,我们会累积一些读者对我们的文章内容感兴趣,当我们发布文章时,有些...

新新新手阅读 Angular 文件 - Component - Day21

本文内容 阅读官方文件 Angular Components Overview 的笔记内容。 Com...

总结 | ML#Day28

由於自己对ML的所知的大略概念,和Vertex的基本使用方式介绍已经结束,已经能够部署和得到预估值,...