mongodb.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import {mongoConfig} from '../config/dbConfig'
  2. import * as mongodb from 'mongodb';
  3. const {Db, MongoClient, ObjectId} = mongodb;
  4. let db: mongodb.Db | null = null;
  5. let client: mongodb.MongoClient | null = null;
  6. async function connectToMongo() {
  7. if (db) {
  8. return db;
  9. }
  10. try {
  11. console.log('开始初始化MongoDB');
  12. const url = `mongodb://${mongoConfig.url}:${mongoConfig.port}`;
  13. console.log('MongoDB连接URL:', url);
  14. // MongoDB 2.x 使用旧式连接方式
  15. client = await MongoClient.connect(url);
  16. db = client.db('sdk');
  17. console.log('MongoDB连接成功');
  18. return db;
  19. } catch (error) {
  20. console.error('连接到MongoDB失败:', error);
  21. throw error;
  22. }
  23. }
  24. // 获取某一个数据库连接
  25. async function getDb(): Promise<mongodb.Db> {
  26. if (!db) {
  27. db = await connectToMongo();
  28. }
  29. return db;
  30. }
  31. // 查询某一个db的集合
  32. async function getCollection(collectionName: string) {
  33. const database = await getDb();
  34. return database.collection(collectionName);
  35. }
  36. //关闭连接
  37. async function closeConnection() {
  38. if (client) {
  39. await client.close();
  40. db = null;
  41. client = null;
  42. console.log("MongoDB连接已关闭");
  43. }
  44. }
  45. //通过id和db查询某一个角色信息
  46. async function getRoleInfoById(dbName: string, roleId: string) {
  47. try {
  48. if (!client) {
  49. await connectToMongo();
  50. }
  51. const database = client!.db(dbName);
  52. const collection = database.collection('char');
  53. const roleInfo = await collection.findOne({roleId: roleId});
  54. return roleInfo;
  55. } catch (error) {
  56. console.error('查询角色信息失败:', error);
  57. return null;
  58. }
  59. }
  60. //查询工会信息
  61. async function getGuildInfoById(dbName: string, uuid: string) {
  62. try {
  63. if (!client) {
  64. await connectToMongo();
  65. }
  66. const database = client!.db(dbName);
  67. const collection = database.collection('guild');
  68. const guildInfo = await collection.findOne({_id: new ObjectId(uuid)});
  69. return guildInfo;
  70. } catch (error) {
  71. console.error('查询工会信息失败:', error);
  72. return null;
  73. }
  74. }
  75. //根据用户ID和服务器ID查询角色信息
  76. async function getRoleInfoByUidAndServerId(newUniqueTag: string, dbName: string) {
  77. try {
  78. if (!client) {
  79. await connectToMongo();
  80. }
  81. const database = client!.db(dbName);
  82. const collection = database.collection('char');
  83. // 查询该用户在该服务器上的角色信息
  84. const roleInfo = await collection.findOne({newUniqueTag: newUniqueTag});
  85. if (roleInfo) {
  86. return {
  87. roleName: roleInfo.name || "未知角色",
  88. roleLevel: roleInfo.lv || 1,
  89. roleId: roleInfo.roleId || "",
  90. head: roleInfo.head || "",
  91. };
  92. }
  93. return null;
  94. } catch (error) {
  95. console.error('查询角色信息失败:', error);
  96. return null;
  97. }
  98. }
  99. /**
  100. * 向玩家发送系统邮件(直接写入 MongoDB)
  101. * @param dbName 游戏服数据库名,如 "ckwy_fy_S001"
  102. * @param newUniqueTag 玩家唯一标识,格式 "channelId|serverId|account"
  103. * @param title 邮件标题
  104. * @param content 邮件内容
  105. * @param items 道具列表,格式 [[itemId, count], ...]
  106. * @returns 发送是否成功
  107. */
  108. async function insertMailToPlayer(
  109. dbName: string,
  110. newUniqueTag: string,
  111. title: string,
  112. content: string,
  113. items: Array<[number, number]>
  114. ): Promise<boolean> {
  115. try {
  116. if (!client) {
  117. await connectToMongo();
  118. }
  119. const database = client!.db(dbName);
  120. // 通过 newUniqueTag 找到角色,取出 _id
  121. const charCol = database.collection('char');
  122. const charDoc = await charCol.findOne({ newUniqueTag });
  123. if (!charDoc) {
  124. console.warn(`[insertMailToPlayer] 找不到角色 newUniqueTag=${newUniqueTag} dbName=${dbName}`);
  125. return false;
  126. }
  127. const receiverUuid = charDoc._id.toString();
  128. const mailDoc: any = {
  129. type: 1, // SYSTEM
  130. receiverUuid,
  131. title,
  132. senderName: title,
  133. head: 0,
  134. content,
  135. time: Math.floor(Date.now() / 1000),
  136. };
  137. if (items && items.length > 0) {
  138. mailDoc.items = items;
  139. mailDoc.flag = 1; // 有道具未领取
  140. } else {
  141. mailDoc.get = 1; // 无道具,直接已读
  142. }
  143. const mailCol = database.collection('mail');
  144. await mailCol.insertOne(mailDoc);
  145. console.log(`[insertMailToPlayer] 邮件发送成功 receiverUuid=${receiverUuid} itemCnt=${items.length}`);
  146. return true;
  147. } catch (error) {
  148. console.error('[insertMailToPlayer] 发送邮件失败:', error);
  149. return false;
  150. }
  151. }
  152. export { getDb, getCollection, closeConnection, getRoleInfoById, connectToMongo, getGuildInfoById, getRoleInfoByUidAndServerId, insertMailToPlayer };