def oninfo(ev,server,plugin): if ev['content'] == '!!here': t = getPlayerInfo(server, ev['sender'], 'Pos') t2 = getPlayerInfo(server, ev['sender'], 'Dimension') server.say(CC(ev['sender'], 'f'), CC(' 位于 ', 'e'), getpos(int(t[0]),int(t[1]),int(t[2]), int(t2))) server.say("[name:{0}, x:{1}, y:{2}, z:{3}, dim:{4}, world:{5}]".format(ev['sender'], int(t[0]),int(t[1]),int(t[2]), int(t2), getdim(int(t2)))) server.tell(ev['sender'], CC('您将会被高亮 30 秒!', '6')) server.execute('effect give ' + ev['sender'] + ' glowing 30 2')
def add_bot(server, sender, name, lint, tp_here=True): if not checkname(server, name): server.tell(sender, CC("[BOT] ", "d"), CC("非法的用户名", "c")) else: server.tell(sender, CC("[BOT] ", "d"), CC("尝试召唤了机器人。如果10秒后没有加入游戏,说明不存在该正版id", "e")) server.execute("/player " + name + " spawn") global trylist trylist.append([sender, name, lint, tp_here])
def onleave(ev, server, plugin): global botlist rem = [] for bot in botlist: if ev["sender"].lower() == bot[1].lower(): server.say(CC("[BOT] ", "d"), CC("机器人 ", "e"), CC(bot[1], "6"), CC(" 离开了。", "e")) rem.append(bot) for bot in rem: botlist.remove(bot)
def makeConfirm(server, user): if user not in [ "ImSingularity", "2233Cheers", "ImLinDun", "Herbst_Q", "AFallLeaf", False ]: server.tell(user, CC("[IB] ", "a"), CC("你没有确认回档的权限。", "c")) else: global confirmed, dest if inProgress and dest is not None: confirmed = True else: server.tell(user, CC("[IB] ", "a"), CC("没有什么可确认的。", "c"))
def log_bot(server, sender): global botlog for log in botlog: server.tell( sender, CC("[BOT] ", "d"), CC( "{0} 玩家 ".format( datetime.datetime.fromtimestamp( log[3]).strftime("%m-%d %H:%M:%S %p")), "e"), CC("console" if log[1] == False else log[1], "f"), CC(" 召唤 " if log[0] == 1 else " 踢出 ", "e"), CC(log[2], "6"))
def register(self, id): self.server.debug(CC("注册插件事件钩子: "), CC(str(self.plugs[id]["plugin"].listener), "el")) for listener in self.plugs[id]["plugin"].listener: t = { "id": uuid.uuid4(), "type": listener["type"], "func": listener["func"] } if self.event.bind(listener["type"], listener["func"], t["id"]): self.plugs[id]["listener"].append(t)
def doclick(server, sender, typ, cot): command = None if cot == "once": command = "/player " + sender + " " + typ + " once" elif cot == "keep": command = "/player " + sender + " " + typ + " continuous" elif cot.startswith("every"): command = "/player " + sender + " " + typ + " interval " + cot[6:] if command: server.execute(command) server.tell(sender, CC("[SELF] ","d"), CC("执行操作 ", "e"), CC(typ, "6"), CC(" "), CC(cot, "6")) else: server.tell(sender, CC("[SELF] ","d"), CC("无法执行操作 ", "e"), CC(typ, "6"), CC(" "), CC(cot, "6"))
def conv(server,ev): global locs args = ev['content'].split(' ') t = getloc(args[2]) if t == False: server.tell(ev['sender'], CC('[LOC] ','b'), CC('找不到该路标,请检查输入!', 'c')) return t1 = convloc(t[0]) if t1 is None: server.tell(ev['sender'], CC('[LOC] ','b'), CC('该路标位于末地!', 'c')) showloc(server,ev['sender'],t[0],t[1]) showlocx(server,ev['sender'],t[0],t[1]) showloc(server,ev['sender'],t1,t[1]) showlocx(server,ev['sender'],t1,t[1])
def tracker(server,plugin,header,remote): global cfg getLogger("requests").setLevel(__import__("logging").WARNING) getLogger("urllib3").setLevel(__import__("logging").WARNING) getLogger("urllib3.connection").setLevel(__import__("logging").WARNING) getLogger("urllib3.connectionpool").setLevel(__import__("logging").WARNING) while True: try: with requests.get(remote + '/api/messages', headers=header, stream=False) as r: r.raise_for_status() for i in r.json(): text = i if "event" not in text or text["event"] != "": continue l.debug("gateway %s sent message %s, sender %s", text["gateway"], text["text"],text["username"]) if text["gateway"] == "discord-minecraft": try: server.say(CC("[Discord] ", "b"), CC("<" + text["username"] + "> ", "7"), CC(text["text"], "f")) except: pass else: try: server.say(CC("[DiscordAdmin] ", "c"), CC("<" + text["username"] + "> ", "7"), CC(text["text"], "f")) except: pass if text["text"] == "stop": l.info("服务器被远程停止。") sendadmin("服务器被远程停止。") server.stop() elif text["text"] == "start": l.info("服务器被远程开启。") sendadmin("服务器被远程开启。") server.start() elif text["text"] == "forcestop": l.info("服务器被强制停止。") sendadmin("服务器被强制停止。") server.stop(True) elif text["text"] == "save-all": l.info("服务器存档保存。") sendadmin("服务器存档保存。") server.execute("save-all") elif text["text"] == "help": sendadmin(" 可用指令有:") sendadmin(" -- stop,start,forcestop,save-all") time.sleep(4) except SystemExit: return except: l.warning("MatterBridge 无法从服务器获取信息。") # __import__("traceback").print_exc(file=sys.stdout) time.sleep(30)
def oninfo(ev, server, plugin): pos = plugin.getplugin("PlayerInfoAPI").getPlayerInfo( server, ev["sender"], "Pos") dim = plugin.getplugin("PlayerInfoAPI").getPlayerInfo( server, ev["sender"], "Dimension") if pos == None: return server.say( CC(ev['sender'], 'f'), CC(" 死亡地点位于", "e"), CC( " {0} [{1},{2},{3}]".format(["地狱", "主世界", "末地"][dim + 1], int(pos[0]), int(pos[1]), int(pos[2])), "6")) server.say("[name:{0}, x:{1}, y:{2}, z:{3}, dim:{4}, world:{5}]".format( ev["sender"] + "死亡地点", int(pos[0]), int(pos[1]), int(pos[2]), dim, getdim(dim)))
def get(server,ev): global locs args = ev['content'].split(' ') t = getloc(args[1]) if t == False: for (j,i) in enumerate(locs): if args[1].lower() in i['name'].lower(): showloc(server,ev['sender'],i,j) showlocx(server,ev['sender'],i,j) t = True if t == False: server.tell(ev['sender'], CC('[LOC] ','b'), CC('找不到任何路标,请检查输入!', 'c')) else: showloc(server,ev['sender'], t[0],t[1]) showlocx(server,ev['sender'],t[0],t[1])
def trigger(self, trigger, eventinfo, asyncrun="-"): self.server.debug(CC("事件 "), CC(str(trigger), "el"), CC(" 被触发!")) if asyncrun == "-": if trigger in [TRIGGER.PLUGIN_UNLOADING, TRIGGER.SERVER_HALT]: asyncrun = False else: asyncrun = True for func in self.fs[trigger.value].items(): if asyncrun: self._asyncRun(func[1], (eventinfo, self.server, self.plugin)) else: try: func[1](eventinfo, self.server, self.plugin) except: traceback.print_exc() l.warning("事件 %s 触发 %s 时产生了异常!检查插件代码。", trigger, func[1])
def load(self, pluginPath): stage = 0 try: self.server.debug(CC("加载插件中: "), CC(pluginPath, "el")) spec = importlib.util.spec_from_file_location( "p_" + pluginPath.replace("plugins/", "").replace( ".py", "").replace("plugins\\", ""), pluginPath) self.plugs.append( {"plugin": importlib.util.module_from_spec(spec)}) stage = 1 spec.loader.exec_module(self.plugs[-1]["plugin"]) self.plugs[-1]["id"] = self.id self.plugs[-1]["listener"] = [] self.plugs[-1]["name"] = self.plugs[-1]["plugin"].name self.id += 1 stage = 2 self.register(len(self.plugs) - 1) self.server.debug(CC("插件加载完成: "), CC(pluginPath, "el")) return self.plugs[-1]["id"] except: self.server.debug(CC("无法加载插件: "), CC(pluginPath, "el")) self.server.debug(CC("错误堆栈详见控制台。", "l")) __import__("traceback").print_exc(file=sys.stdout) if stage == 2: try: self.deregister(len(self.plugs) - 1) except: pass self.id -= 1 if stage >= 1: self.plugs.pop() return False
def addHere(server, ev): global locs args = ev['content'].split(' ') t = checkname(args[2]) if t != False: server.tell(ev['sender'], CC('[LOC] ','b'),CC(t,'c')) return t = getPlayerInfo(server, ev["sender"], "Pos") t1 = getPlayerInfo(server, ev["sender"], "Dimension") locs.append({'name': args[2], 'pos': {'x': int(t[0]),'y': int(t[1]),'z': int(t[2])},'dim': t1}) server.say(CC('[LOC] ','b'),CC(ev['sender'], 'f'), CC(' 添加了路标 ', 'e'), CC(locs[-1]['name'], '6'), CC(' 位于 ', 'e'), getpos(locs[-1]), CC(',ID 为 ', 'e'), CC(str(len(locs) - 1), '6'))
def printhelp(server): global cfg, data, inProgress if not inProgress: for t in """Increasing Backup 帮助 !!ib help - 查看此帮助 !!ib backup <说明> - 建立新备份 !!ib restore <ID> - 回档到 <ID> !!ib view - 查看所有备份 !!ib refresh - 手动刷新备份列表-不推荐使用 !!ib confirm/abort 确认/取消 回档操作。""".split("\n"): server.say(CC(t, "e"))
def printhelp(server): for t in """Location 路标插件 帮助 !!loc help - 查看此帮助 !!loc save - 立刻保存所有路标到硬盘 !!loc add <路标名称> <X> <Y> <Z> <世界ID> - 新建一个路标 !!loc add <路标名称> here - 在你所在的位置新建路标 !!loc del <路标名称或 ID> - 删除一个路标 !!loc conv <路标名称或 ID> - 查看一个路标对应的地狱坐标或主世界坐标 !!loc ex - 以 VoxelMap 格式显示所有坐标 !!loc <路标名称或 ID> - 查看一个路标的信息。若该路标不存在,将在所有路标中搜索。 !!loc - 查看所有路标 世界 ID 说明: 0 - 主世界,1 - 末地,-1 - 地狱""".split("\n"): server.say(CC(t,"e"))
def oncmd(ev, server, plugin): t = ev["content"] if not t.startswith("!!ib"): return g = t.split(" ") if (len(g) == 2 and g[1] == "help") or (len(g) == 1): printhelp(server) elif (len(g) >= 2 and g[1] == "view"): makeView(server) elif (len(g) >= 2 and g[1] == "backup"): if len(g) == 2: makeBackup(server) else: makeBackup(server, ' '.join(g[2:])) elif (len(g) >= 3 and g[1] == "restore"): makeRestore(server, g[2], plugin) elif (len(g) >= 2 and g[1] == "confirm"): makeConfirm(server, ev["sender"]) elif (len(g) >= 2 and g[1] == "refresh"): refreshView(server) elif (len(g) >= 2 and g[1].startswith("a")): makeAbort(server) else: server.say(CC("[IB] ", "a"), CC("错误的或不存在的指令。输入 !!ib help 查看命令帮助。"))
def add(server, ev): global locs args = ev['content'].split(' ') t = checkname(args[2]) if t != False: server.tell(ev['sender'], CC('[LOC] ','b'),CC(t,'c')) return locs.append({ 'name': args[2], 'pos': {'x': int(args[3]),'y': int(args[4]),'z': int(args[5])}, 'dim': int(args[6]) }) server.say(CC('[LOC] ','b'),CC(ev['sender'], 'f'), CC(' 添加了路标 ', 'e'), CC(locs[-1]['name'], '6'), CC(' 位于 ', 'e'), getpos(locs[-1]), CC(',ID 为 ', 'e'), CC(str(len(locs) - 1), '6'))
def onjoin(ev, server, plugin): global botlist, trylist rem = [] for bot in trylist: if ev["sender"].lower() == bot[1].lower(): global botlog botlog.append( [1, bot[0], bot[1], datetime.datetime.now().timestamp()]) if len(botlog) > 30: botlog = botlog[len(botlog) - 30:] server.say(CC("[BOT] ", "d"), CC(bot[0], "f"), CC(" 召唤了机器人 ", "e"), CC(bot[1], "6"), CC(" 注释 ", "e"), CC(bot[2], "6")) rem.append(bot) tt = bot[3] bot[3] = True botlist.append(bot) server.execute("gamemode 0 " + bot[1]) if tt: server.execute("tp " + bot[1] + " " + bot[0]) elif bot[1] in loclist: lc = loclist[bot[1]] server.execute( "execute in {0} run tp {1} {2} {3} {4} {5} {6}".format([ "the_nether", "overworld", "the_end" ][lc[3] + 1], bot[1], lc[0], lc[1], lc[2], 123, 45)) time.sleep(1) l.debug("execute in {0} run tp {1} {2} {3} {4} {5} {6}".format( ["the_nether", "overworld", "the_end"][lc[3] + 1], bot[1], lc[0], lc[1], lc[2], lc[4], lc[5])) server.execute( "execute in {0} run tp {1} {2} {3} {4} {5} {6}".format([ "the_nether", "overworld", "the_end" ][lc[3] + 1], bot[1], lc[0], lc[1], lc[2], lc[4], lc[5])) for bot in rem: trylist.remove(bot)
def makeView(server): global cfg, data, inProgress if not inProgress: server.say(CC("[IB] ", "a"), CC("下面为所有的备份:(ID/说明)", "e")) for i, j in enumerate(data["backups"]): server.say( CC(str(i), "d"), CC(" / ", "f"), CC( "无说明" if j["description"].strip() == "" else j["description"], "e"), CC(" / ", "f"), CC( datetime.datetime.fromtimestamp(int( j["time"])).strftime('%Y.%m.%d %H:%M:%S')))
def oninfo(ev,server,plugin): if ev["sender"] != False and ev["content"].startswith('!!loc'): if re.match(r"^!!loc help$", ev["content"]): printhelp(server) elif re.match(r"^!!loc save$", ev["content"]): global locs utils.saveData('location', locs) server.tell(ev["sender"], CC('[LOC] ','b'), CC('保存完毕', 'e')) elif re.match(r"^!!loc add \S+ -?\d+ -?\d+ -?\d+ (-1|0|1)$", ev["content"]): add(server, ev) elif re.match(r"^!!loc add \S+ here$", ev["content"]): addHere(server, ev) elif re.match(r"^!!loc del \S+$", ev["content"]): delete(server, ev) elif re.match(r"^!!loc conv \S+$", ev["content"]): conv(server, ev) elif re.match(r"^!!loc ex$", ev["content"]): getAllVoxel(server, ev) elif re.match(r"^!!loc \S+$", ev["content"]): get(server, ev) elif re.match(r"^!!loc$", ev["content"]): getAll(server, ev) else: server.tell(ev["sender"], CC('[LOC] ','b'), CC('输入无效,使用 !!loc help 查看帮助', 'c'))
def delete(server, ev): global locs args = ev['content'].split(' ') t = getloc(args[2]) if t == False: server.tell(ev['sender'], CC('[LOC] ','b'), CC('找不到对应的路标,请检查输入!', 'c')) else: t = t[0] locs.remove(t) server.say(CC('[LOC] ','b'),CC(ev['sender'], 'f'), CC(' 删除了路标 ', 'e'), CC(t['name'], '6'),CC(' 位于 ', 'e'),getpos(t))
def tp_bot(server, sender, name): global botlist for bot in botlist: if bot[1].lower() == name.lower(): if bot[0].lower() != sender.lower(): server.tell(sender, CC("[BOT] ", "d"), CC("你不是这个 bot 的主人!", "c")) return server.tell(sender, CC("[BOT] ", "d"), CC("已发出 tp 申请", "e")) server.execute("/tp " + bot[1] + " " + sender) return server.tell(sender, CC("[BOT] ", "d"), CC("不存在该bot!", "c"))
def save_bot(server, sender, name, plugin): global botlist for bot in botlist: if bot[1].lower() == name.lower(): if bot[0].lower() != sender.lower() and sender not in [ "ImSingularity", "ImLinDun", "Herbst_Q", "2233Cheers" ]: server.tell(sender, CC("[BOT] ", "d"), CC("你不是这个 bot 的主人!", "e")) return server.tell(sender, CC("[BOT] ", "d"), CC("已发出 save 申请", "e")) storepos(server, bot, plugin) return server.tell(sender, CC("[BOT] ", "d"), CC("不存在该bot!", "c"))
def oninfo(ev,server,plugin): if ev['content'] == '!!whereis' or ev['content'] == '!!whereis help': server.tell(ev['sender'], CC('用法:!!whereis <玩家名>', 'e')) elif re.match(r"^!!whereis ([a-zA-Z0-9_]{1,16})$", ev['content']): player = re.match(r"^!!whereis ([a-zA-Z0-9_]{1,16})$", ev['content']).group(1) if not player.lower() in server.playerlist_lower: server.tell(ev['sender'], CC('该玩家不存在', 'c')) t = getPlayerInfo(server, player, 'Pos') t2 = getPlayerInfo(server, player, 'Dimension') server.say(CC(player, 'f'), CC(' 位于 ', 'e'), getpos(int(t[0]),int(t[1]),int(t[2]), int(t2))) server.say("[name:{0}, x:{1}, y:{2}, z:{3}, dim:{4}, world:{5}]".format(player, int(t[0]),int(t[1]),int(t[2]), int(t2), getdim(int(t2)))) server.tell(ev['sender'], CC('该玩家将会被高亮 30 秒!', '6')) server.tell(player, CC('有人查询您的位置,您将会被高亮 30 秒!', '6')) server.execute('effect give ' + player + ' glowing 30 2')
def kickall_bot(server, sender, plugin): if sender not in [ "ImSingularity", "ImLinDun", "2233Cheers", "Herbst_Q", False ]: server.tell(sender, CC("[BOT] ", "d"), CC("你没有 kickall 的权限", "e")) return global botlist for bot in botlist: server.tell(sender, CC("[BOT] ", "d"), CC("已发出 kick ", "e"), CC(bot[1], "6"), CC(" 申请", "e")) storepos(server, bot, plugin) global botlog botlog.append([0, sender, bot[1], datetime.datetime.now().timestamp()]) if len(botlog) > 30: botlog = botlog[len(botlog) - 30:] server.execute("/player " + bot[1] + " kill")
def tppos_bot(server, sender, name, x, y, z, dim): global botlist for bot in botlist: if bot[1].lower() == name.lower(): if bot[0].lower() != sender.lower(): server.tell(sender, CC("[BOT] ", "d"), CC("你不是这个 bot 的主人!", "c")) return server.tell( sender, CC("[BOT] ", "d"), CC("已发出 tp [{0},{1},{2} {3}] 申请".format(x, y, z, dim), "e")) server.execute("/execute in {0} run tp {1} {2} {3} {4}".format( dim, bot[1], x, y, z)) return server.tell(sender, CC("[BOT] ", "d"), CC("不存在该bot!", "c"))
def unload(self, pluginId): try: self.server.debug(CC("卸载插件 "), CC(self.plugs[pluginId]["name"], "el"), CC(" 中,插件 ID 为 "), CC(pluginId, "al")) self.event.trigger( TRIGGER.PLUGIN_UNLOADING, { "name": self.plugs[pluginId]["name"], "plugin": self.plugs[pluginId]["plugin"] }, False) self.deregister(pluginId) del self.plugs[pluginId]["plugin"] self.plugs[pluginId] = {} return True except: self.server.debug(CC("无法卸载插件 ID "), CC(pluginId, "al")) self.server.debug(CC("错误堆栈详见控制台。", "l")) __import__("traceback").print_exc(file=sys.stdout) return False
def check_bot(server, sender, name): global botlist for bot in botlist: if bot[1].lower() == name.lower(): if bot[0].lower() != sender.lower(): server.tell(sender, CC("[BOT] ", "d"), CC("你不是这个 bot 的主人!", "e")) return False if bot[3] == False: server.tell(sender, CC("[BOT] ", "d"), CC("该 bot 处于创造模式!", "e")) return False return True server.tell(sender, CC("[BOT] ", "d"), CC("不存在该bot!", "c")) return False
def gm_bot(server, sender, name, gm, plugin): global botlist for bot in botlist: if bot[1].lower() == name.lower(): if bot[0].lower() != sender.lower() and sender not in [ "ImSingularity", "ImLinDun", "Herbst_Q", "2233Cheers" ]: server.tell(sender, CC("[BOT] ", "d"), CC("你不是这个 bot 的主人!", "e")) return server.tell(sender, CC("[BOT] ", "d"), CC("已发出 gamemode 申请", "e")) if gm == "c": bot[3] = False else: bot[3] = True server.execute("/gm{0} {1}".format(gm, bot[1])) return server.tell(sender, CC("[BOT] ", "d"), CC("不存在该bot!", "c"))