def confirm(bot, update): var.set('blogarticlepos', 0) update.message.reply_text('(%d/%d)\n%s' % ( 1, (len(var.get('blogarticle', '')) - 1) // 500 + 1, var.get('blogarticle', '')[:500] + '...\n/yes [title] [ascii title] 确认发送\n/no 继续编辑\n/prevpage 上一页 \n/nextpage 下一页' )) return READY
def addtext(bot, update): text = update.message.text var.set('blogarticle', var.get('blogarticle', '') + text + '\n') update.message.reply_text( '(%d)\n%s' % (len(var.get('blogarticle', '')), var.get('blogarticle', '')[-500:] + '...\n/preview 命令来预览发送\n/cancel 命令退出写作模式')) return WM
def writemode(bot, update): if not check_admin(update.message.from_user.id): return ConversationHandler.END var.set('blogarticle', '') var.set('blogarticleimg', []) update.message.reply_text( '进入写作模式\n请发给我文字或图片\n/preview 命令来预览发送\n/cancel 命令退出写作模式') return WM
def check(bot, update): thread = var.get('blogarticlethread', None) if thread == None or thread.isAlive() == False: var.set('blogarticlethread', None) update.message.reply_text('发送完成\n/wm 开启新的一篇文章') return ConversationHandler.END else: update.message.reply_text('发送中...\n/check 检查发送进度\n/cancel 退出写作模式') return SENT
def callback_rss(bot, job): unreadnum = var.get('rssunreadnum', 0) lastid = var.get('rsslatestid', 0) if unreadnum >= const.MINIFLUX_MAXUNREAD: return entries = miniflux_client.get_entries(lastid) for x in entries: send_entry(bot, x) lastid = max(lastid, x['id']) var.set('rsslatestid', lastid) var.set('rssunreadnum', unreadnum + len(entries))
def confirm_yes(bot, update, args): if len(args) != 2: update.message.reply_text('usage: /yes [title] [ascii title]') return READY article = var.get('blogarticle', '') article += '\n\n> via [msbot](https://github.com/zrt/bot)\n' thread = articlemanager.create(args[0], args[1], article, var.get('blogarticleimg', [])) var.set('blogarticlethread', thread) update.message.reply_text('发送中...\n/check 检查发送进度\n/cancel 退出写作模式') return SENT
def rsssetlatestentryid(bot, update, args): if not check_admin(update.message.from_user.id): return # show info and help result = '' entryid = -1 try: entryid = int(args[0]) var.set('rsslatestid', entryid) result = 'ok ' + str(entryid) except Exception as e: result = 'error ' + str(e) update.message.reply_text(result)
def nextpage(bot, update): pos = var.get('blogarticlepos', 0) if pos >= (len(var.get('blogarticle', '')) - 1) // 500: update.message.reply_text('没有下一页qwq') else: pos = pos + 1 var.set('blogarticlepos', pos) update.message.reply_text('(%d/%d)\n%s' % ( pos + 1, (len(var.get('blogarticle', '')) - 1) // 500 + 1, var.get('blogarticle', '')[pos * 500:(pos + 1) * 500] + '...\n/yes [title] [ascii title] 确认发送\n/no 继续编辑\n/prevpage 上一页 \n/nextpage 下一页\n/cancel 命令退出写作模式' )) return READY
def addimg(bot, update): file_id = update.message.photo[-1] newFile = bot.get_file(file_id) file_name = 'blog_img_%s.png' % randstr() newFile.download(file_name) var.get('blogarticleimg', []).append(file_name) var.set('blogarticle', var.get('blogarticle', '') + '![photo](/img/%s)\n' % file_name) update.message.reply_text( '(%d)\n%s' % (len(var.get('blogarticle', '')), var.get('blogarticle', '')[-500:] + '...\n/preview 命令来预览发送\n/cancel 命令退出写作模式')) return WM
def startapp(bot): global TOKEN global BOT BOT = bot if TOKEN == 'random': TOKEN = randstr() var.set('httpcallback_token', TOKEN) var.set('httpcallback_port', const.HTTPCALLBACK_PORT) var.set('httpcallback_channel', const.HTTPCALLBACK_BINDCHANNEL) var.set('httpcallback_maxlen', const.HTTPCALLBACK_MAXLEN) app.run(debug=False, host='0.0.0.0', port=const.HTTPCALLBACK_PORT)
def gui(rgraph=False): #MainImports import func import var import statext # from tkinter import Tk from tkinter import ttk from tkinter import messagebox import tkinter.ttk as ttk import tkinter as tk import time from tkinter import filedialog from tkinter.filedialog import askopenfilename #from math import * import csv import numpy as np from numpy import arange, sin, pi import pickle #Graph Imports import matplotlib as mpl import matplotlib.animation as animation import matplotlib.pyplot as plt import matplotlib.backends.tkagg as tkagg from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2TkAgg) from matplotlib.figure import Figure import re #from decimal import * mpl.use('TkAgg') #Variables stats = ["Determination", "Crit", "Direct Hit"] det_data1 = 1 crit_data1 = 1 direct_data1 = 1 det_request = 0 direct_request = 0 crit_request = 0 request6 = 0 stat_extra1 = 0 stat_extra2 = 0 stat_extra3 = 0 stat_extra4 = 0 stat_extra5 = 0 stat_extra6 = 0 stat_info1 = 0 stat_info2 = 0 stat_info3 = 0 #Load CSVS data_list = [ 'det3.csv', 'crit.csv', 'direct.csv', 'tenacity.csv', 'ss.csv' ] datafile = [np.loadtxt(file, delimiter=",") for file in data_list] #MainApp master = Tk() master.title("FFXIV Quick Math") master.geometry("1200x650") #Tab Stuff rows = 0 while rows < 50: master.rowconfigure(rows, weight=1) master.columnconfigure(rows, weight=1) rows += 1 #Tab Placement nb = ttk.Notebook(master) nb.grid(row=1, column=0, columnspan=50, rowspan=49, sticky='NESW') ######################################## Character Stats ######################################## page1 = ttk.Frame(nb) nb.add(page1, text='Character Stats') #Start showing info tk.Label(page1, text="Determination:", anchor="e", width=12).grid(row=0) tk.Label(page1, text="Direct Hit:", anchor="e", width=12).grid(row=1) tk.Label(page1, text="Critical Hit:", anchor="e", width=12).grid(row=2) e1 = tk.Entry(page1) e1.grid(row=0, column=1) e2 = tk.Entry(page1) e2.grid(row=1, column=1) e3 = tk.Entry(page1) e3.grid(row=2, column=1) #Show Stats Function def showstats(): import var var.p_det = e1.get() lbl4.configure(text=var.p_det) var.p_direct = e2.get() lbl5.configure(text=var.p_direct) var.p_crit = e3.get() lbl6.configure(text=var.p_crit) button = tk.Button(page1, text="Update", command=showstats) button.place(x=100, y=68) #button.grid(column=3, row= 1) #Setting Stat Info Block #Show Stat Block lbl1 = tk.Label(page1, text='Determination:', anchor="e", width=12) lbl1.grid(column=4, row=0) lbl2 = tk.Label(page1, text='Direct Hit:', anchor="e", width=12) lbl2.grid(column=4, row=1) lbl3 = tk.Label(page1, text='Critical Hit:', anchor="e", width=12) lbl3.grid(column=4, row=2) lbl4 = tk.Label(page1, text='Waiting...') lbl4.grid(column=5, row=0) lbl5 = tk.Label(page1, text='Waiting...') lbl5.grid(column=5, row=1) lbl6 = tk.Label(page1, text='Waiting...') lbl6.grid(column=5, row=2) gui.lbl4 = lbl4 gui.lbl5 = lbl5 gui.lbl6 = lbl6 ######################################## Tab 2 ######################################## page2 = ttk.Frame(nb) nb.add(page2, text='Stat Extrapolation') #Input Variables p = tk.PanedWindow(page2, bg="grey", borderwidth=1, height=85, orient=tk.VERTICAL) p.grid(row=0, column=0) tk.Label(p, text="Max Determination:", anchor="e", width=15).grid(row=0) tk.Label(p, text="Max Direct Hit:", anchor="e", width=15).grid(row=1) tk.Label(p, text="Max Critical Hit:", anchor="e", width=15).grid(row=2) tk.Label(p, text="Max Stat Meld:", anchor="e", width=15).grid(row=3) e4 = tk.Entry(p) e5 = tk.Entry(p) e6 = tk.Entry(p) e7 = tk.Entry(p) e4.grid(row=0, column=1) e5.grid(row=1, column=1) e6.grid(row=2, column=1) e7.grid(row=3, column=1) #Extrapolation Info Output #Info p2 = tk.PanedWindow(page2, bg="grey", borderwidth=1, orient=tk.VERTICAL) p2.grid(row=0, column=2) tk.Label(p2, text="Stat: ", anchor="e", width=10).grid(row=0, column=2) tk.Label(p2, text="Multiplier: ", anchor="e", width=10).grid(row=1, column=2) tk.Label(p2, text="Materia: ", anchor="e", width=10).grid(row=2, column=2) #1st Stat p1 = tk.PanedWindow(page2, bg="grey", borderwidth=1, orient=tk.VERTICAL) p1.grid(row=0, column=3) statinfo1 = tk.Label(p1, text="Waiting...", anchor="w", width=12) statinfo1.grid(row=0, column=3) statinfo2 = tk.Label(p1, text="Waiting...", anchor="w", width=12) statinfo2.grid(row=1, column=3) statinfo3 = tk.Label(p1, text="Waiting...", anchor="w", width=12) statinfo3.grid(row=2, column=3) #2nd Stat p3 = tk.PanedWindow(page2, bg="grey", borderwidth=1, orient=tk.VERTICAL) p3.grid(row=0, column=4) statinfo4 = tk.Label(p3, text="Waiting...", anchor="w", width=12) statinfo4.grid(row=0, column=4) statinfo5 = tk.Label(p3, text="Waiting...", anchor="w", width=12) statinfo5.grid(row=1, column=4) statinfo6 = tk.Label(p3, text="Waiting...", anchor="w", width=12) statinfo6.grid(row=2, column=4) #3rd Stat p4 = tk.PanedWindow(page2, bg="grey", borderwidth=1, orient=tk.VERTICAL) p4.grid(row=0, column=5) statinfo7 = tk.Label(p4, text="Waiting...", anchor="w", width=12) statinfo7.grid(row=0, column=5) statinfo8 = tk.Label(p4, text="Waiting...", anchor="w", width=12) statinfo8.grid(row=1, column=5) statinfo9 = tk.Label(p4, text="Waiting...", anchor="w", width=12) statinfo9.grid(row=2, column=5) def showstats1(): import var var.det_request = e4.get() var.direct_request = e5.get() var.crit_request = e6.get() var.request6 = e7.get() button1 = tk.Button(page2, text="Update", command=showstats1) button1.place(x=100, y=90) #button1.grid(column=1, row= 4) #Graph Stat Extrapolation #fig = plt.Figure(figsize=(5.5, 5), dpi=100) #global a #a = fig.add_subplot(111) #x = datafile[0][0] #x1 = datafile[0][1] #y = datafile[1][0] #y1 = datafile[1][1] #z = datafile[2][0] #z1 = datafile[2][1] #t = datafile[3][0] #t1 = datafile[3][1] #s = datafile[4][0] #s1 = datafile[4][1] #global canvas #canvas = FigureCanvasTkAgg(fig, master=page2) #plt.ion() #Graph Plotting #Checking State global showDet, showCrit, showDirect, showTen, showS, a, canvas, det_plot1, crit_plot1, direct_plot1, ten_plot1, s_plot1, fig showDet = tk.IntVar(value=1) showCrit = tk.IntVar(value=1) showDirect = tk.IntVar(value=1) showTen = tk.IntVar(value=1) showS = tk.IntVar(value=1) fig = plt.Figure(figsize=(5.5, 5), dpi=100) a = fig.add_subplot(111) x = datafile[0][0] x1 = datafile[0][1] y = datafile[1][0] y1 = datafile[1][1] z = datafile[2][0] z1 = datafile[2][1] t = datafile[3][0] t1 = datafile[3][1] s = datafile[4][0] s1 = datafile[4][1] canvas = FigureCanvasTkAgg(fig, master=page2) det_plot, = a.step(x, x1, label='Determination') crit_plot, = a.step(y, y1, label='Crit') direct_plot, = a.step(z, z1, label='Direct') ten_plot, = a.step(t, t1, label='Tenacity') s_plot, = a.step(s, s1, label="Skill/Spell Speed") #Setting up Graph def graph(regraph=0): if regraph == 0: print('initializing graph') #det_plot, = a.plot(x, x1, label='Determination') #crit_plot, = a.plot(y, y1, label='Crit') #direct_plot, = a.plot(z, z1, label='Direct') #ten_plot, = a.plot(t, t1, label='Tenacity') #s_plot, = a.plot(s, s1, label="Skill/Spell Speed") toolbar_frame = ttk.Frame(page2) toolbar_frame.place(x=400, y=600) toolbar = NavigationToolbar2TkAgg(canvas, toolbar_frame) toolbar.update() toolbar.grid(row=9, column=9) plt.ion() a.grid() a.legend() a.set_title('Stats') a.set_xlabel('Materia') a.set_ylabel('Modifier') fig.patch.set_facecolor('#F0F0F0') a.set_facecolor(('#F0F0F0')) canvas.get_tk_widget().grid(column=1, row=7) canvas._tkcanvas.grid(column=1, row=7) canvas.draw() if regraph == 1: print('Clearing') fig.clear() c1 = 'orange' c2 = 'blue' c3 = 'green' ps1 = a.scatter(var.d1[0], var.d1[1], 40, c1, label=var.stat_info1) ps2 = a.scatter(var.d2[0], var.d2[1], 40, c2, label=var.stat_info2) ps3 = a.scatter(var.d3[0], var.d3[1], 40, c3, label=var.stat_info3) canvas.draw() else: pass #State of Checkboxes (CLEAN UP)################################################################ def stat_state(): det_plot.set_visible(not det_plot.get_visible()) try: det_plot1.set_visible(not det_plot1.get_visible()) except: pass a.legend() canvas.draw() def stat_state1(): crit_plot.set_visible(not crit_plot.get_visible()) try: crit_plot1.set_visible(not crit_plot1.get_visible()) except: pass a.legend() canvas.draw() def stat_state2(): direct_plot.set_visible(not direct_plot.get_visible()) try: direct_plot1.set_visible(not direct_plot1.get_visible()) except: pass a.legend() canvas.draw() def stat_state3(): ten_plot.set_visible(not ten_plot.get_visible()) try: ten_plot1.set_visible(not ten_plot1.get_visible()) except: pass a.legend() canvas.draw() def stat_state4(): s_plot.set_visible(not s_plot.get_visible()) try: s_plot1.set_visible(not s_plot1.get_visible()) except: pass a.legend() canvas.draw() ########################################################################################### #Show Stat Button tk.Checkbutton(page2, text="Determination", variable=showDet, command=stat_state).place(x=780, y=200) tk.Checkbutton(page2, text="Crit", variable=showCrit, command=stat_state1).place(x=780, y=220) tk.Checkbutton(page2, text="Direct", variable=showDirect, command=stat_state2).place(x=780, y=240) tk.Checkbutton(page2, text="Tenacity", variable=showTen, command=stat_state3).place(x=780, y=260) tk.Checkbutton(page2, text="S Speed", variable=showS, command=stat_state4).place(x=780, y=280) #def scatter(): # d1 = (var.stat_extra2, var.stat_extra1) # d2 = (var.stat_extra4, var.stat_extra3) # d3 = (var.stat_extra6, var.stat_extra5) # var.legend([]) # ##########Lazy Colour Set####### # if stat_info1 == 'Crit': # c1 = 'orange' # if stat_info1 == 'Determination': # c1 = 'blue' # if stat_info1 == 'Direct Hit': # c1 = 'green' # if stat_info2 == 'Crit': # c2 = 'orange' # if stat_info2 == 'Determination': # c2 = 'blue' # if stat_info2 == 'Direct Hit': # c2 = 'green' # if stat_info3 == 'Crit': # c3 = 'orange' # if stat_info3 == 'Determination': # c3 = 'blue' # if stat_info3 == 'Direct Hit': # c3 = 'green' # ##########Lazy Colour Set End####### # a.clear() # global det_plot1, crit_plot1, direct_plot1, ten_plot1, s_plot1 # showDet.get() # det_plot1, = a.plot(x, x1, label='Determination') # crit_plot1, = a.plot(y, y1, label='Crit') # direct_plot1, = a.plot(z, z1, label='Direct') # ten_plot1, = a.plot(t, t1, label='Tenacity') # s_plot1, = a.plot(s, s1, label="Skill/Spell Speed") # ps1 = a.scatter(d1[0],d1[1],40,c1, label=stat_info1) # ps2 = a.scatter(d2[0],d2[1],40,c2, label=stat_info2) # ps3 = a.scatter(d3[0],d3[1],40,c3, label=stat_info3) # a.set_title('Stats') # a.set_xlabel('Materia') # a.set_ylabel('Modifier') # a.grid() # a.legend() # canvas.draw() button2 = tk.Button(page2, text="Calculate", command=lambda number=2: callback(number)) #button2.place(x=380, y=90) button2.grid(column=4, row=4) #Load and Save Buttons button3 = tk.Button(page1, text="Save", command=func.savestats) button3.place(x=150, y=68) button4 = tk.Button(page1, text="Load", command=lambda number=1: callback(number)) button4.place(x=125, y=98) ######################################## Tab 3 - Gear Comparison ######################################## page3 = ttk.Frame(nb) nb.add(page3, text='Gear Comparison') tk.Label(page3, text="Item 1", width=12).grid(row=0) tk.Label(page3, text="Item 2", width=12).grid(row=0, column=2) tk.Label(page3, text="Attack Power", width=12).grid(row=1, column=1) tk.Label(page3, text="Determination", width=12).grid(row=2, column=1) tk.Label(page3, text="Direct Hit", width=12).grid(row=3, column=1) tk.Label(page3, text="Critical Hit", width=12).grid(row=4, column=1) tk.Label(page3, text="S Speed", width=12).grid(row=5, column=1) #Item 1 ap = tk.IntVar() ap1 = tk.IntVar() det = tk.IntVar() det1 = tk.IntVar() dh = tk.IntVar() dh1 = tk.IntVar() ch = tk.IntVar() ch1 = tk.IntVar() ss = tk.IntVar() ss1 = tk.IntVar() tk.Entry(page3, textvariable=ap).grid(row=1) tk.Entry(page3, textvariable=det).grid(row=2) tk.Entry(page3, textvariable=dh).grid(row=3) tk.Entry(page3, textvariable=ch).grid(row=4) tk.Entry(page3, textvariable=ss).grid(row=5) #Item 2 tk.Entry(page3, textvariable=ap1).grid(row=1, column=2) tk.Entry(page3, textvariable=det1).grid(row=2, column=2) tk.Entry(page3, textvariable=dh1).grid(row=3, column=2) tk.Entry(page3, textvariable=ch1).grid(row=4, column=2) tk.Entry(page3, textvariable=ss1).grid(row=5, column=2) #More Damage tk.Label(page3, text="Item 1", width=12).grid(row=0) tk.Label(page3, text="Item 2", width=12).grid(row=0, column=2) tk.Label(page3, text="Attack Power", width=12).grid(row=1, column=1) tk.Label(page3, text="Determination", width=12).grid(row=2, column=1) tk.Label(page3, text="Direct Hit", width=12).grid(row=3, column=1) tk.Label(page3, text="Critical Hit", width=12).grid(row=4, column=1) tk.Label(page3, text="S Speed", width=12).grid(row=5, column=1) #Math jobmod = 2170 basemain = 292 basesub = 364 CrtMb = 400 CrtA = 200 CrtCb = 50 DHA = 550 DetA = 130 SSA = 130 TNCA = 100 #Compare Function def compare_ap(): AP = ap.get() AP1 = ap1.get() DET = det.get() DET1 = det1.get() DH = dh.get() DH1 = dh1.get() CH = ch.get() CH1 = ch1.get() SS = ss.get() SS1 = ss1.get() AttackPower1 = (1 + floor(SSA * (AP - basemain) / basemain) / 100) AttackPower2 = (1 + floor(SSA * (AP1 - basemain) / basemain) / 100) DetMult1 = (1000 + floor((SSA * (DET - basemain)) / jobmod)) / 1000 DetMult2 = (1000 + floor((SSA * (DET1 - basemain)) / jobmod)) / 1000 DirectChance1 = floor(DH - basesub) / 39.09 * 0.01 DirectChance2 = floor(DH1 - basesub) / 39.09 * 0.01 DirectMult1 = (DirectChance1 * 1.25 + (1 - DirectChance1)) DirectMult2 = (DirectChance2 * 1.25 + (1 - DirectChance2)) CritChance1 = floor( (0.05 + (CH - basesub) / 108.5 * 0.01) * 1000) / 1000 CritDamage1 = floor(CH - basesub) / 108.5 * 0.01 + 1.4 CritMult1 = (CritDamage1 * CritChance1) + (1 - CritChance1) CritChance2 = floor( (0.05 + (CH1 - basesub) / 108.5 * 0.01) * 1000) / 1000 CritDamage2 = floor(CH1 - basesub) / 108.5 * 0.01 + 1.4 CritMult2 = (CritDamage2 * CritChance2) + (1 - CritChance2) #Label Stuff AP_Inc = int((AttackPower2 - AttackPower1) * 1000) / 1000 DET_Inc = int((DetMult2 - DetMult1) * 1000) / 1000 DH_Inc = int((DirectMult2 - DirectMult1) * 1000) / 1000 C_Inc = int((CritMult2 - CritMult1) * 1000) / 1000 aplb.configure(text=AP_Inc) aplb1.configure(text=DET_Inc) aplb2.configure(text=DH_Inc) aplb3.configure(text=C_Inc) aplb = tk.Label(page3, text='Waiting', width=12) aplb.grid(row=1, column=3) aplb1 = tk.Label(page3, text='Waiting', width=12) aplb1.grid(row=2, column=3) aplb2 = tk.Label(page3, text='Waiting', width=12) aplb2.grid(row=3, column=3) aplb3 = tk.Label(page3, text='Waiting', width=12) aplb3.grid(row=4, column=3) button = tk.Button(page3, text="Calculate", command=compare_ap) button.place(x=135, y=135) ######################################## Tab 4 - Rotation Planner ######################################## page4 = ttk.Frame(nb) nb.add(page4, text='Rotation Planner') #Ability Select global Abilities Abilities = ["Waiting for Input"] var1 = tk.StringVar(master) var1.set(Abilities[0]) w1 = tk.OptionMenu(page4, var1, Abilities) w1.grid(row=1, column=0) # Key-value dictionary with job name, ability list ability_dict = { "Dragoon": [ "Heavy Thrust", "Impulse Drive", "Disembowel", "Chaos Thrust", "Wheeling Thrust", "Fang and Claw", "True Thrust", "Vorpal Thrust", "Full Thrust" ], "Bard": ["Bard", "Ability"], "Red Mage": ["adsf"] } def Class(var): Abilities = ability_dict[var] w1["menu"].delete(0, "end") for a in Abilities: w1["menu"].add_command(label=a, command=Ability()) tk._setit(var1, a) #Find Ability CSV global ability2 ability2 = "Waiting" def Ability(): ability_data = np.genfromtxt('abilities.csv', delimiter=',', dtype=None) #tk._setit(ability1, var1.get()) ability1 = var1.get() ability1_search = np.where(ability_data[0] == ability1, ability_data[2], ability_data[1]) ability2 = ability1_search[1] tk.Label(page4, text=ability2, anchor="e", width=12).grid(row=1, column=1) #Class Select Classes = [ "Bard", "Black Mage", "Dragoon", "Machinist", "Monk", "Ninja", "Red Mage", "Samurai", "Summoner" ] var = tk.StringVar(master) var.set("Pick Class") w = tk.OptionMenu(page4, var, *Classes, command=Class) w.grid(row=0, column=0) if rgraph: print('gui regraphing') graph(1) print('gui regraphing ended') else: pass master.iconbitmap(r'data\jump.ico') graph(0) tk.mainloop()
def callback_query(bot, update): if not check_admin(update.callback_query.from_user.id): return callback_data = update.callback_query.data origin_message_id = update.callback_query.message.message_id text = update.callback_query.message.text chat_id = update.callback_query.message.chat_id args = callback_data.split(',') entryid = int(args[1]) isread = int(args[2]) isstar = int(args[3]) motd_keyboard = None callbackanswer = '' if args[0] == 'rssmarkread': motd_keyboard = [[ InlineKeyboardButton('📦 ✅', callback_data="rssmarkunread,%d,%d,%d" % (entryid, 1, isstar)), InlineKeyboardButton( '✨' + ['', ' ✅'][isstar], callback_data="%s,%d,%d,%d" % (("rssmarkstar", "rssmarkunstar")[isstar], entryid, 1, isstar)) ]] callbackanswer = 'å·²æ ‡è®°ä¸ºå·²è¯»' elif args[0] == 'rssmarkstar': motd_keyboard = [[ InlineKeyboardButton( '📦 ✅', callback_data="%s,%d,%d,%d" % (("rssmarkread", "rssmarkunread")[1], entryid, isread, 1)), InlineKeyboardButton('✨ ✅', callback_data="rssmarkunstar,%d,%d,%d" % (entryid, isread, 1)) ]] callbackanswer = 'å·²æ˜Ÿæ ‡' elif args[0] == 'rssmarkunread': motd_keyboard = [[ InlineKeyboardButton('📦', callback_data="rssmarkread,%d,%d,%d" % (entryid, 0, isstar)), InlineKeyboardButton( '✨' + ['', ' ✅'][isstar], callback_data="%s,%d,%d,%d" % (("rssmarkstar", "rssmarkunstar")[isstar], entryid, 0, isstar)) ]] callbackanswer = 'å·²æ ‡è®°ä¸ºæœªè¯»' elif args[0] == 'rssmarkunstar': motd_keyboard = [[ InlineKeyboardButton('📦' + ['', ' ✅'][isread], callback_data="%s,%d,%d,%d" % (("rssmarkread", "rssmarkunread")[isread], entryid, isread, 0)), InlineKeyboardButton('✨', callback_data="rssmarkstar,%d,%d,%d" % (entryid, isread, 0)) ]] callbackanswer = 'å·²åŽ»æŽ‰æ˜Ÿæ ‡' else: return motd_markup = InlineKeyboardMarkup(motd_keyboard) bot.edit_message_text(chat_id=chat_id, message_id=origin_message_id, text=text, reply_markup=motd_markup) bot.answer_callback_query(callback_query_id=update.callback_query.id, text=callbackanswer) if args[0] == 'rssmarkread': var.set('rssunreadnum', var.get('rssunreadnum', 1) - 1) miniflux_client.markread(entryid) elif args[0] == 'rssmarkstar': miniflux_client.markread(entryid) miniflux_client.markstar(entryid) elif args[0] == 'rssmarkunread': miniflux_client.markunread(entryid) elif args[0] == 'rssmarkunstar': miniflux_client.markunstar(entryid) else: return