def post(self): if self.get_argument("username", default=None) is None: # TODO Check whether username is exist username = "******" + hashlib.md5(str(time.time()) + str(random())).hexdigest()[0:8] password = hashlib.md5(str(time.time()) + str(random())).hexdigest() user = User.new(username=username, password=hashlib.md5(password).hexdigest()) user.screen_name = username.replace("GUEST_", u"游客")[0:6] else: username = self.get_argument("username") password = hashlib.md5(self.get_argument("password")).hexdigest() user = User.verify_user(username, password) if user is None: message = {"status": "failed", "content": "invalid username or password"} else: message = {"status": "success", "username": user.username, "password": password} self.session["user_id"] = user.id if user.last_login == None: user.bonus_notification = 1 else: last_login_date = datetime.fromtimestamp(user.last_login) if last_login_date.date() < datetime.today().date(): user.bonus_notification = 1 user.last_login = int(time.time()) self.set_header("Access-Control-Allow-Origin", "*") self.write(json.dumps(message))
def post(self): print "Got Venmo payment update" print self.request.body js = json.loads(self.request.body) date = js['date_created'] updateType = js['type'] data = js['data'] if updateType == "payment.created": driverID = data['target']['user']['id'] passengerID = data['actor']['id'] driver = User.gql('WHERE venmoID=' + driverID).get() passenger = User.gql('WHERE venmoID=' + passengerID).get() payment = Payment(type="Venmo", dateCreated=date, lastUpdate=date, status=data['status'], driver=driver, passenger=passenger, apiID=data['id'], amount=data['amount'], note=data['note']) payment.put() # send channel updates to each channel.send_message(str(driver.key().id()), "{}"); channel.send_message(str(passenger.key().id()), "{}"); elif updateType == "payment.updated": status = data['status'] payment = Payment.gql("WHERE apiID=" + data['id']) payment.status = status payment.lastUpdated = date # need to check that this is working properly # add in logic for payment processing # check the status and update user/ride info accordingly self.processPayment(data, status, payment) payment.put()
def create_user(Session,username,password,public_key,creator): s=Session user=get_user(s,username) if user is None: if creator: cid=creator.id else: cid=None u=User(name=username,password=genpw(password),creator=cid,public_key=public_key) s.add(u) s.commit() return True else: u=user if not creator: return False if u.id==creator.id or creator.name=='admin': if not password is None: if password=='': u.password='' else: u.password=genpw(password) if not public_key is None: u.public_key=public_key s.merge(u) s.commit() return True return False
def authorized(): global facebook_graph # check to make sure the user authorized the request if not 'code' in request.args: flash('You did not authorize the request') return redirect(url_for('index')) code = request.args['code'] access_token_url = 'https://graph.facebook.com/oauth/access_token' access_token_url_params = {'client_id': app.config['FB_CLIENT_ID'], 'redirect_uri': url_for('login.authorized', _external=True), 'client_secret': app.config['FB_CLIENT_SECRET'], 'code': code } access_token_text = requests.get(access_token_url, params=access_token_url_params).text access_token = re.split('=|&', access_token_text)[1] facebook_graph = facebook.GraphAPI(access_token) me = facebook_graph.get_object("me") fb_id = me['id'] session['fb_id'] = fb_id session['name'] = me['name'] session['logged_in'] = True user = User.query.filter_by(fb_id=fb_id).first() if user is None: user = User(fb_id, access_token) db.session.add(user) db.session.commit() else: user.access_token = access_token db.session.merge(user) db.session.commit() return redirect(url_for('index'))
def get_user_info(self, code): client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL) r = client.request_access_token(code) access_token = r.access_token expires_in = r.expires_in print r.access_token, r.expires_in client.set_access_token(access_token, expires_in) uid = client.get.account__get_uid().uid print uid user = User.verify_user_openID(accountType=User.USER_TYPE_SINA_WEIBO, accountID=uid) if not user: user_info = client.get.users__show(uid=uid) user = User.new( username="******" % (User.USER_TYPE_SINA_WEIBO, uid), accountType=User.USER_TYPE_SINA_WEIBO, accountID=uid, ) user.screen_name = user_info.screen_name user.gender = user_info.gender user.headPortrait_url = user_info.profile_image_url # avatar_large? print user_info user.openIDinfo = user_info else: print "old user" if user.last_login == None: user.bonus_notification = 1 else: last_login_date = datetime.fromtimestamp(user.last_login) if last_login_date.date() < datetime.today().date(): user.bonus_notification = 1 user.last_login = int(time.time()) self.got_user_info(uid, user)
def create_user(username, password, email): salt = make_salt() hashed = hash_password(password, salt) u = User(username=username, email=email, salt=salt, password=hashed) u.put()
def test_getUser(): u = User( user_id=111222333, first_name='Denis', username='******', last_name='Balyko' ) u_test = InstanceTelegramTest.getUser() assert type(u) == type(u_test), 'type getUser' assert u_test.__repr__() == u.__repr__(), 'eq getUser'
def test_getHalfUser(): u = User( user_id=111222333, first_name='Denis2', username='', last_name='BalykoTest' ) u_test = InstanceTelegramTestNoCommand.getUser() assert type(u) == type(u_test), 'type getUser' assert u_test.__repr__() == u.__repr__(), 'eq getUser'
def post(self): username = self.request.get('user') password = self.request.get('password') password_repeated = self.request.get('verify') email = self.request.get('email') # Validate input and generate needed error messages if not validations.is_valid_username: username_error = 'Invalid Username' elif User.username_exists(username): username_error = 'That username is already in use.' else: username_error = '' password_error = ('' if validations.is_valid_password(password) else 'Invalid Password.') password_repeated_error = ('' if (password_error or password == password_repeated) else 'Passwords do not match.') email_error = ('' if (not email or validations.is_valid_email(email)) else 'Invalid Email Address.') errors = [username_error, password_error, password_repeated_error, email_error] # If success, send to welcome page if all(not error for error in errors): # Success! # Hash password hashed_pwd = auth.make_pw_hash(username, password) # Add to database new_user_entry = User(username=username, password=hashed_pwd, email=email, parent=ndb.Key('Users', 'user_group')) # if email: # new_user_entry.email = email new_user_entry.put() # Add cookie self.force_login(username) redirect_when_finished = self.request.get('redirect_when_finished') return self.redirect_with_queries( '/welcome', [('redirect_when_finished', redirect_when_finished)]) else: # If any checks failed, send back to the signup page # with error messages. Repopulate fields except for passwords. self.response.out.write(self.template.render( entered_username=username, email=email, username_error=username_error, password_error=password_error, password_repeated_error=password_repeated_error, email_error=email_error ))
def recoverUsernameUsingEmail(self, email): sender_address = "*****@*****.**" user = User.gql("WHERE email=:email", email=email).get() subject = "College Carpool Username Recovery" body = "Your College Carpool Username is: %s" % (user.username) print body mail.send_mail(sender_address, email, subject, body)
def api_v1_login(): if "username" not in request.json or "password" not in request.json: abort(418) user = User.get_user_by_name(request.json["username"]) if not user.login(request.json["password"]): abort(418) return success()
def get(self): AUTHORIZATION_CODE = self.request.get('code') data = { "client_id": constants.CLIENT_ID, "client_secret": constants.CLIENT_SECRET, "code":AUTHORIZATION_CODE } response = requests.post("https://api.venmo.com/v1/oauth/access_token", data) response_dict = response.json() # update user venmo info like email and venmoID db_user = User.get_by_id(self.getUser()) if db_user.permission == "guest": pass else: db_user.venmoID = int(response_dict.get('user').get('id')) db_user.venmo_email = response_dict.get('user').get('email') db_user.put() access_token = response_dict.get('access_token') user = response_dict.get('user').get('username') self.session['venmo_token'] = access_token self.session['venmo_username'] = user self.session['signed_into_venmo'] = True nextURL = self.request.get('next') return self.redirect(nextURL if nextURL else '/home')
def attempt_login(self, entered_username, password): """Attempt to login given a username and password. If the credentials are invalid, return False and do nothing. If the credentials are valid, add a user cookie and return True. Args: entered_username (str): Username for the attempted login password (str): plaintext password user enters Returns: bool: True if login was successful, False if not """ user_in_db = User.get_by_username(entered_username) if (user_in_db is not None and auth.password_is_valid(entered_username, password, user_in_db.password)): # If we have a match, the credentials are good self.force_login(entered_username) return True else: return False
def prepare(self): domain_query = DomainLogs.select().where(DomainLogs.domain == self.request.host).first() if not domain_query: user = User.select().where(User.domain == self.request.host.split(".")[-3]).first() if not user: return domain_query = DomainLogs() domain_query.user_id = user.id domain_query.domain = self.request.host domain_query.save() log = DNSLogs() log.ip = self.request.headers.get('X-Forwarded-For') log.user_id = user.id log.domain_id = domain_query.id log.save() if not self.request.uri == "/favicon.ico": log = UrlLogs() packet = "%s %s %s\n" % (self.request.method, self.request.uri, self.request.version) for header in self.request.headers: packet += "%s: %s\n" % (header, self.request.headers.get(header)) packet += "\n%s" % self.request.body log.url = self.request.uri log.ip = self.request.headers.get("X-Forwarded-For") log.domain_id = domain_query.id log.user_id = domain_query.user_id log.packet = packet log.save()
def adminActionRoute(action=None, id=None): if not loggedIn(): return flashy('/', 'You must be logged in to do that!', 'error') if not action: return flashy('/', 'There was an error processing your request!', 'error') if not request.form.get('isact') and not id or id and not id.isdigit(): #Best ifstatement EVAR return flashy('/', 'Invalid or maliformed request!', 'error') if action == 'delete_proj': q = [i for i in Project.select().where(Project.id == int(id))] if not len(q): return flashy('/', 'Invalid Project ID (%s)' % id, 'error') q[0].delete_instance() return flashy('/', 'Deleted Project #%s!' % id, 'success') elif action == 'add_proj': q = [i for i in Project.select().where(Project.name == request.form.get('pname'))] if len(q): return flashy('/admin', 'There is already a project with the name "%s"' % request.form.get('pname'), 'error') p = Project( name=request.form.get('pname'), author=User.get(User.id==session.get('uid')), desc=request.form.get('pdesc'), url=request.form.get('purl'), repo_type=request.form.get('repotype'), repo_name=request.form.get('pgitname').lower(), repo_url=request.form.get('giturl')) p.save() return flashy('/admin', 'Added project "%s" (ID #%s)' % (p.name, p.id), 'success')
def post(self): player_id = self.get_argument("id", -1); player = User.find(_id = player_id) portrait = None family = "-1" position = "-1" percentage = 0 if player.headPortrait_url is not None: portrait = player.headPortrait_url #if player.family is not None: # family = player.family.name # position= player.family_position.name if player.total_games > 0: percentage = (player.won_games * 1.0) / player.total_games message = { "status": "success", "name": player.screen_name, "head_portrait": portrait, "family": family, "position": position, "level": player.level, "asset": player.asset, "percentage": "%.2f%%" % (percentage * 100), "total_games": player.total_games, "won_games": player.won_games, "max_reward": player.max_reward, "last_login": datetime.fromtimestamp(player.last_login).strftime("%Y-%m-%d %H:%M:%S"), "signature": player.signature or "This guy is too lazy to leave a signature", "friends": str(player.friends), "gender": player.gender } self.write(json.dumps(message)) self.finish()
def post(self): try: user = User.get_by_id(self.getUser()) self.sendActivationEmail(user.email, user.activationCode) self.render("verify.html", color="green", status="Email Sent") except: self.render("verify.html", color="end", status="Email failed to send")
def handleUserJoin(obj): if not obj['joined']: return u = RUser(obj['u'], 0, r) if u.isOnline() and not u.getCurrentServer()['sid'] == obj['sid']: #If the user is online, kick them from the first server push(obj['sid'], {"a": "kick", "u": obj['u'], "msg": "User joined another server..."}) u.joinServer(obj['sid']) u.addServerHistory(obj['sid']) # Join Message q = User.select().where(User.username == obj['u']) if not q.count(): packs = [{"a": "sendto", "user": obj['u'], "msg": i} for i in need_reg_msgs] push(obj['sid'], packs) return resp = [ {"a": "sendto", "user": obj['u'], "msg": "{C_RED}{C_ITALIC}Your user level has been synced."}, {"a": "user_level", "user": obj['u'], "level": q[0].level}] push(obj['sid'], resp) msg = [{"a": "sendto", "user": None, "msg": "{C_AQUA}%s {C_GOLD}{C_ITALIC}has joined %s" % (q[0].username, u.getCurrentServer()['name'])}] for fr in q[0].getFriends(): tmp = RUser(fr.username, fr.id, r) if tmp.perma['CFG_NOTI_FRIEND_JOIN'] is False: continue if tmp.isOnline(): msg[0]['user'] = tmp.name push(tmp.getCurrentServer()['sid'], msg)
def post(self): if "recoverUsername" in self.request.POST: try: email = self.request.get('email') self.recoverUsernameUsingEmail(email) self.render('recover.html', color="green", status="Sent recovery email to %s :)" % (email)) except: self.render('recover.html', color="red", status="Could not send email to %s :(" % (email)) elif "recoverPassword" in self.request.POST: try: username = self.request.get('username') email = "" user = None if username: print username user = User.gql("WHERE username=:username", username=username).get() email = user.email else: email = self.request.get('email') user = User.gql("WHERE email=:email", email=email).get() salt = validation.make_salt(25) link = "http://%s/recover?userID=%s&code=%s" % (self.request.host, user.key().id(), salt) user.recoveryCode = salt user.put() self.sendPasswordRecoveryEmail(email, user, link) self.render('recover.html', color="green", status="Sent recovery email to a %s account :)" % (email.split("@")[1])) except: self.render('recover.html', color="red", status="Could not send email :(") elif "resetPassword" in self.request.POST: userID = self.request.get('userID') user = User.get_by_id(int(userID)) newPass = self.request.get('newPassword') passwordSuccess, passwordError = "", "" if newPass == self.request.get('verifyNewPassword'): user.passHash = validation.make_pw_hash(user.username, newPass) user.recoveryCode = None user.put() passwordSuccess = "Password Changed Successfully!" self.render('recover.html', color="green", status=passwordSuccess) else: passwordError = "New passwords are not the same" self.render('recover.html', color="red", status=passwordError, recover=True, userID=userID)
def create_user(self, login=None): user = User() if login is not None: # User already exist ? query = self.database.query(User).filter( User.login == login ) if query.count() >= 1: return query.first() user.login = login user.generate_token() user.last_connection = datetime.datetime.now() self.database.merge(user) self.database.commit() return user
def login(username, password): u = User.query(User.username == username).get() if u and valid_password(password, u.salt, u.password): error = '' else: error = 'Invalid login!' return error
def login(): form = LoginForm(request.form) if request.method == 'POST' and form.validate(): # user = Users(request.form['username'],request.form['password']) # user = db.session.query(User).filter_by(username=request.form['username'],password=request.form['password']).first() user = User(username=request.form['username'],password=request.form['password']) print(user.username,user.password,user.get_id(),user.is_active(),user.is_anonymous(),user.is_authenticated()) if user.is_authenticated(): login_user(user) return redirect(url_for('search')) else: return render_template('login.html',form=form) return render_template('login.html',form=form)
def _process_data(self, data,method): request_type = method if request_type == 'payments_get_items': item_id = data["credits"]['order_info'] item = Commodity.find(commodity_id = int(item_id)) itemInfo = {} itemInfo['item_id'] = item_id itemInfo['title'] = item.title itemInfo['price'] = item.price itemInfo['description'] = item.description itemInfo['image_url'] = item.image_url response = {"content":[itemInfo], "method":request_type} elif request_type == "payments_status_update": order_details = json.loads(data['credits']['order_details']) item_data = order_details['items'][0]['data'] if "modified" in item_data: earned_currency_order = item_data['modified'] else: earned_currency_order = None current_order_status = order_details["status"] if current_order_status == "placed": if earned_currency_order != None: print earned_currency_order # product = earned_currency_order['product'] # product_title = earned_currency_order['product_title'] # product_amount = earned_currency_order['product_amount'] # credits_amount = earned_currency_order['credits_amount'] client_id = data['user_id'] items = order_details['items'] client = User.verify_user_openID( accountType = User.USER_TYPE_FACEBOOK, accountID = client_id) for item in items: commodity = Commodity.find(commodity_id = int(item["item_id"])) client.update_attr('asset', commodity.money) self.save_order(client_id, order_details) next_order_status = "settled" response = { "content" : { "status":next_order_status, "order_id":order_details['order_id'] }, "method" : request_type } elif current_order_status == "disputed": raise Exception("disputed") pass elif current_order_status == "refunded": raise Exception("refunded") elif current_order_status == "settled": response = {} else: raise Exception(request_type) print json.dumps(response) self.finish(json.dumps(response))
def get_redmine(self, sender): redmine = self._cache.get(sender) if redmine is None: redmine = Redmine(self.redmine_url) redmine.default_project_id = self.project_id user = User.get_user_by_jid(sender) if user: redmine.key = user.key self._cache[sender] = redmine return redmine
def get_user_exercises(user_id, ex_id): if Token.invalid(user_id, request.path, request.json): abort(403) user = User.get(user_id) if user == None: abort(404) exercise = user.getExercise(ex_id) if exercise == None: abort(404) return jsonify(exercise)
def register_view(self): form = RegistrationForm(request.form) if helpers.validate_form_on_submit(form): user = User() form.populate_obj(user) # we hash the users password to avoid saving it as plaintext in the db, # remove to use plain text: user.password = generate_password_hash(form.password.data) db.session.add(user) db.session.commit() login.login_user(user) return redirect(url_for('.index')) link = '<p>Already have an account? <a href="' + url_for('.login_view') + '">Click here to log in.</a></p>' self._template_args['form'] = form self._template_args['link'] = link return super(MyAdminIndexView, self).index()
def loginRoute(): if not 'user' in request.form.keys() or not 'pw' in request.form.keys(): return flashy('/', 'All fields must be filled in!', 'error') q = [i for i in User.select().where(User.username == request.form.get('user'))] if not len(q): return flashy('/', 'No such user with that name!', 'error') if bcrypt.hashpw(request.form.get('pw'), q[0].password) == q[0].password: session['logged'] = True session['uid'] = q[0].id return flashy('/', 'You have been logged in!', 'success') return flashy('/', 'Invalid password!', 'error')
def register_view(): form = RegistrationForm(request.form) if form.validate_on_submit(): user = User() form.populate_obj(user) user.salt = str(time.time()) hash_password = hashlib.sha512() hash_password.update(user.salt + user.password) user.password = hash_password.hexdigest() db.session.add(user) db.session.commit() login.login_user(user) flash('You were registered', 'info') return redirect(url_for('show_challenges')) return render_template('form.html', form=form)
def post(self): user = User.get_by_id(self.getUser()) if "updatePassword" in self.request.POST: password_success, password_error = "", "" if validation.valid_pw(user.username, self.request.get('currentPassword'), user.passHash): new_pass = self.request.get('new_password') if new_pass == self.request.get('verifyNewPassword'): user.passHash = validation.make_pw_hash( user.username, new_pass) user.put() password_success = "Password Changed Successfully!" else: password_error = "New passwords are not the same" else: password_error = "That is not your current password" self.render('admin.html', user=user, update_error=password_error, update_success=password_success) elif "otherChanges" in self.request.POST: user_email = self.request.get('email') venmo_email = self.request.get('venmo_email') email = validation.edu_email(user_email) venmo_email_verify = validation.email(venmo_email) email_error, venmo_email_error, update_success, update_error = "", "", "", "" if not email: email_error = "That's not a valid email." user_email = "" if venmo_email != "" and venmo_email_verify is None: venmo_email_error = "Invalid email. This is an optional field." venmo_email = "" if email and (venmo_email_error == ""): try: user.email = user_email user.venmo_email = venmo_email user.bio = self.request.get('bio') user.put() update_success = "Succesfully Updated!" except: update_error = "Could not save changes :(" self.render('admin.html', user=user, update_success=update_success, update_error=update_error, email_error=email_error, venmo_email_error=venmo_email_error)
def validate(self): rv = FlaskForm.validate(self) if rv is None: return False user = User.objects(username__iexact=self.username.data).first() if user is None: return True else: self.username.errors.append("Username is already taken - try again") return False
#category_database_data.py #This file is responsible for preloading the category database with information from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from database import Base, User, Category, Item engine = create_engine('sqlite:///catalog.db') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) session = DBSession() user1 = User(name="Ariana Lopez", email="*****@*****.**") session.add(user1) user2 = User(name="Alaina Lopez", email="*****@*****.**") session.add(user2) user3 = User(name="Mike Wayne", email="*****@*****.**") session.add(user3) user4 = User(name="Thomas Nyguen", email="*****@*****.**") session.add(user4) category1 = Category(name="Football") session.add(category1) category2 = Category(name="Softball") session.add(category2) category3 = Category(name="Volleyball") session.add(category3)
def patch(self): args = detailV.parse_args() userId = request.environ['decoded']['id'] result = User.updateById(userId, args) return result['data'], result['code']
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from database import Base, City, Immobile, User, engine Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) session = DBSession() User1 = User(name="Robot", email="*****@*****.**") session.add(User1) session.commit() city1 = City(name="Rio de Janeiro", user_id="1") session.add(city1) session.commit() immobileDetails1 = Immobile(address="Rua Ituverava, 1033, Rio de Janeiro", description="House", squarefeet="1323 squarefeet", bedrooms="4 bedrooms", bathrooms="4 bathrooms", city=city1, user_id="1") session.add(immobileDetails1) session.commit()
def registerSubmit(form): # check if username en email there firstName = form.get('firstName', None) lastName = form.get('lastName', None) country = form.get('country', None) email = form.get('email', None) username = form.get('username', None) password = form.get('password', None) username = username.replace(" ", "") email = email.replace(" ", "") firstName = firstName.strip() lastName = lastName.strip() firstName = firstName.lower() lastName = lastName.lower() country = country.lower() email = email.lower() username = username.lower() password = password.lower() if checks.checkSpecialChars([username]): return jsonify({ "message": "Please use no special characters in your username!" }), 400, {'ContentType': 'application/json'} if checks.checkSpecialCharsEmail(email): return jsonify({ "message": "Please use no special characters in your email!" }), 400, {'ContentType': 'application/json'} if checks.emptyCheck([firstName, lastName, email, country, username, password]): return jsonify({ "message": "Please fill in all fields." }), 400, {'ContentType': 'application/json'} if checks.lengthSixtyFourCheck([firstName, lastName, country, email, username]): return jsonify({ "message": "Please don't fill in more than 64 characters." }), 400, {'ContentType': 'application/json'} password = form.get('password', None) check = checks.passwordLengthCheck(password) if check == [False, "short"]: return jsonify({ "message": "Please make your password 5 characters or longer." }), 400, {'ContentType': 'application/json'} if check == [False, "long"]: return jsonify({ "message": "Please keep your password shorter than 64 characters." }), 400, {'ContentType': 'application/json'} if persister.checkUserExistance(username, email): return jsonify({ "message": "Username or email already exists." }), 400, {'ContentType': 'application/json'} user = User( username=username, email=email, firstName=firstName, lastName=lastName, password=pbkdf2_sha256.hash(password), country=country ) persister.persist_object(user) persister.addFriend(username, "Never Travel Alone") return jsonify({ "message": "Welcome to TravelBuddy! You are now a member." }), 200, {'ContentType': 'application/json'}
from database import db, User, Item, SellerItem, initialize_db if __name__ == '__main__': initialize_db() user1 = User(name="Rounaq Jhunjhunu Wala", username="******", password="******", email="*****@*****.**") user2 = User(name="Shivam Jhunjhunu Wala", username="******", password="******", email="*****@*****.**") user3 = User(name="Anand Stationers", username="******", password="******", email="*****@*****.**") db.session.add(user1) db.session.add(user2) db.session.add(user3) db.session.commit() item1 = Item( title="Pencil", description="writing tool", img_url= 'https://cdn5.vectorstock.com/i/1000x1000/22/49/yellow-pencil-symbol-icon-design-beautiful-vector-21872249.jpg' ) item2 = Item(
def test_select(self): a = User.create(username='******', password='******', email='piyo@com')
from database import db_session, User, MenuItem, Restaurant, RestaurantAddress # Create fake user User1 = User(name="Robo Barista", email="*****@*****.**", picture='https://pbs.twimg.com/profile_images/2671170543/18debd694829ed78203a5a36dd364160_400x400.png') db_session.add(User1) db_session.commit() # Menu for UrbanBurger restaurant1 = Restaurant(user_id=1, name="Urban Burger", phone="1111112222", email="*****@*****.**", food_type="mix", website="www.test.com", description="test") db_session.add(restaurant1) db_session.commit() restaurantaddres = RestaurantAddress(restaurant_id=1, street="1 road", city="lansing", state="Michigan", zip_code="48910") db_session.add(restaurantaddres) db_session.commit() menuItem2 = MenuItem(user_id=1, name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", price="$7.50", course="Entree", restaurant=restaurant1) db_session.add(menuItem2) db_session.commit() menuItem1 = MenuItem(user_id=1, name="French Fries", description="with garlic and parmesan", price="$2.99", course="Appetizer", restaurant=restaurant1)
def __init__(self): self.__data = Database() self.__cur_user = User() self.__users = [] self.__posts = []
class QuickTouch: # constructor def __init__(self): self.__data = Database() self.__cur_user = User() self.__users = [] self.__posts = [] # functions def auth_user(self): log = input("Enter your login - ") password = input("Enter your password - ") if self.check_user(log, password): return True else: print("Incorrect login or password, try again.") return False def check_user(self, log, password): self.__users = self.__data.get_users() for line in self.__users: if line.get_log() == log and line.get_pass() == password: self.__cur_user.set_id(line.get_id()) self.__cur_user.set_log(line.get_log()) self.__cur_user.set_name(line.get_name()) self.__cur_user.set_surname(line.get_surname()) self.__cur_user.set_pass(line.get_pass()) self.__cur_user.set_access(line.get_access()) self.__cur_user.set_friends(line.get_friends()) return True return False def check_pass(self, password): if all([ any(letter.isupper() for letter in password), any(letter.islower() for letter in password), any(letter.isnumeric() for letter in password), len(password) >= 6 ]): return True else: return False def check_log(self, log): for usr in self.__users: if usr.get_log() == log: return False if not len(log) >= 1: return False return True def new_user(self): user = User() while True: name = input("Enter your name: ") surname = input("Enter your surname: ") log = input("Enter your login: "******"Enter your password: "******"Such login already exists or its", "length is less than 1 character.") if not self.check_pass(password): print( "Your password must be at least 6 characters long and", "contain at least 1 upper, lower case letters and 1 digit." ) if self.check_log(log) and self.check_pass(password): # checks if users.txt is empty (ternary doesn't work) if self.__users == []: temp = str() else: temp = self.__users[-1] # to avoid 'index out of range' error (ternary doesn't work) if isinstance(temp, str): id = 0 else: id = temp.get_id() user.set_id(id + 1) friend = Friend(user.get_id()) user.set_log(log) user.set_name(name) user.set_surname(surname) user.set_pass(password) user.set_friends(friend) break self.__data.push_user(user) def new_post(self): post = Post() txt = input() self.__posts = self.__data.get_posts() # checks if posts.txt is empty (ternary doesn't work) if self.__posts == []: temp = str() else: temp = self.__posts[-1] post.set_crt(self.__cur_user.get_id()) # to avoid 'index out of range' error (ternary doesn't work) if isinstance(temp, str): id = 0 else: id = temp.get_id() post.set_id(id + 1) post.set_txt(txt) self.__data.push_post(post) def search(self): query = input() searched = self.__data.search_users(query, self.__cur_user.get_id()) if searched == []: print("No matches were found.") else: for usr in searched: print(f"{usr.get_id()} - {usr.get_name()}", f"{usr.get_surname()} - {usr.get_log()}") while True: choice = input("\n1 - See person's wall" + "\n2 - Send friend request" + "\n3 - Back to the profile\n") if choice == "1": id = str() while id != "-1": try: id = input("Enter user ID: ") self.__users = self.__data.get_users() if (int(id) == self.__cur_user.get_id() or any( [(int(id) == user.get_id() and user.get_access()[0].get_count() == 0) or (int(id) == user.get_id() and user.get_access()[0].get_count() == 1 and [self.__cur_user.get_id()] in [ user.get_friends().get_list()[idx][:1] for idx in range( len(user.get_friends().get_list())) ]) for user in self.__users])): self.show_wall(int(id)) break elif id != "-1": print("User with such ID was not found,", "or access is restricted.") except ValueError: pass elif choice == "2": id = str() while id != "-1": try: id = input("Enter user ID: ") self.__users = self.__data.get_users() __temp__ = self.__cur_user.get_friends().get_list() x = all( int(id) != p[0] for p in self.__cur_user.get_friends().get_list()) if any([ int(id) == user.get_id() and all( int(id) not in p for p in self. __cur_user.get_friends().get_list()) and int(id) != self.__cur_user.get_id() and not [self.__cur_user.get_id(), 1] in user.get_friends().get_list() and not [self.__cur_user.get_id(), 0] in user.get_friends().get_sent() for user in self.__users ]) or (not [ int(id), 0 ] in self.__cur_user.get_friends().get_sent()): self.__data.request_handler( self.__cur_user.get_id(), int(id), 0) for usr in self.__users: if usr.get_id() == int(id): print("Friend request to", f"{usr.get_name()}", f"{usr.get_surname()}", "has been sent.") break break elif id != "-1": print("Incorrect ID, please try again.") except ValueError: pass elif choice == "3": break def show_wall(self, id): # id - id of the user posts = self.__data.get_posts(id) if posts == [] and id == self.__cur_user.get_id(): print("Your wall is empty") elif posts == [] and id != self.__cur_user.get_id(): for line in self.__users: if line.get_id() == id: print(f"{line.get_name()} {line.get_surname()}'s'", "wall is empty.") for post in posts: print(str(post.get_id()) + " " + post.get_txt()) return posts def show_my_posts(self): posts = self.show_wall(self.__cur_user.get_id()) choice = input("\n1 - Delete the post\n2 - Back to the profile\n") if choice == "1": id = int() while id != -1: try: id = int(input("Enter post ID: ")) if any([ self.__cur_user.get_id() == post.get_crt() and post.get_id() == id for post in posts ]): self.__data.delete_post(id) break elif id != -1: print("Post with such ID was not found,", "or you are not allowed to delete it.") except ValueError: pass self.show_my_posts() elif choice == "2": pass else: self.show_my_posts() def friend_list(self): if self.__cur_user.get_friends().get_list() == []: print("\nYour friend list is empty.") else: print("\nYour friends:") for elem in self.__cur_user.get_friends().get_list(): for usr in self.__users: pass if usr.get_id() in elem[:1]: print(f"{usr.get_id()} -", f"{usr.get_name()} {usr.get_surname()}") break if self.__cur_user.get_friends().get_sent() == []: print("\nYou have no friend requests.") else: print("\nFriend requests:") for elem in self.__cur_user.get_friends().get_sent(): for usr in self.__users: if usr.get_id() in elem[:1]: print( f"{usr.get_id()} -", f"{''.join([usr.get_name(), usr.get_surname()])}") break def show_friends(self): self.check_user(self.__cur_user.get_log(), self.__cur_user.get_pass()) self.friend_list() while True: try: opr = input("\n1 - Remove friend" + "\n2 - Accept request" + "\n3 - Reject request" + "\n4 - Back to the profile\n") if opr == "1": if self.__cur_user.get_friends().get_list() != []: id = str() while id != "-1": try: id = input("Enter user ID: ") if ([ int(id), 1 ] in self.__cur_user.get_friends().get_list()): self.__data.remove_friend( self.__cur_user.get_id(), int(id)) for usr in self.__users: if usr.get_id() == int(id): print(f"{usr.get_name()}", f"{usr.get_surname()}", "has been removed from", "your friend list.") break self.check_user(self.__cur_user.get_log(), self.__cur_user.get_pass()) self.friend_list() break elif id != "-1": print("Incorrect ID, please try again.") except ValueError: pass else: print("Your friend list is empty.") elif opr == "2" or opr == "3": if self.__cur_user.get_friends().get_sent() != []: id = str() while id != "-1": try: id = input("Enter user ID who sent" + "you friend request: ") if ([ int(id), 0 ] in self.__cur_user.get_friends().get_sent()): self.__data.request_handler( int(id), self.__cur_user.get_id(), int(opr) - 1) for usr in self.__users: if usr.get_id() == int(id): print( "Request from", f"{usr.get_name()}", f"{usr.get_surname()}", "has been", (("rejected.", "accepted.")[opr == "2"]), ) break self.check_user(self.__cur_user.get_log(), self.__cur_user.get_pass()) self.friend_list() break elif id != -1: print("Incorrect ID, please try again.") except ValueError: pass else: print("You have no friend requests.") elif opr == "4": break except ValueError: pass def settings(self): opt = input("\n1 - Who can view your wall - " + ( ("Nobody", "Only friends")[self.__cur_user.get_access()[0].get_count() == 1], "All users")[self.__cur_user.get_access()[0].get_count() == 0] + "\n2 - Back to the profile\n") if opt == "1": self.__data.change_settings(self.__cur_user.get_id(), 0) self.check_user(self.__cur_user.get_log(), self.__cur_user.get_pass()) self.settings() elif opt == "2": pass else: self.settings() def show_prof(self): print(f"\n\n{self.__cur_user.get_name()}", f"{self.__cur_user.get_surname()}") choice = input("1 - Search for a user" + "\n2 - My Wall\n3 - Publish a post" + "\n4 - My Friends\n5 - Settings\n6 - Log out\n") if choice == "1": self.check_user(self.__cur_user.get_log(), self.__cur_user.get_pass()) self.search() self.show_prof() elif choice == "2": self.show_my_posts() self.show_prof() elif choice == "3": self.new_post() self.show_prof() elif choice == "4": self.check_user(self.__cur_user.get_log(), self.__cur_user.get_pass()) self.show_friends() self.show_prof() elif choice == "5": self.settings() self.show_prof() elif choice == "6": pass else: self.show_prof()
def help_message(bot, update): logger.info('/help or /start command') User.upsert(update.effective_user) update.message.reply_markdown(SHORT, reply_markup=extended_help_markup, disable_web_page_preview=True)
session.add(categories) session.commit def addItem(item): for i in item: items = Item(name=i[0], price=i[1], description=i[2], category_ID=i[3], user_ID=i[4]) session.add(items) session.commit """If the table is empty, create dummy user and execute the helper""" """functions to populate the tables""" if session.query(Categories.ID).all() == []: session.rollback() dummyUser = User(name="guberland") session.add(dummyUser) session.commit addCatagory(DBSampleData.SampleCategory) addItem(DBSampleData.SampleItem) # Create anti-forgery state token @app.route('/login/') def showLogin(): """create anti 32 bit forgery token and bring the user to login page""" state = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(32)) login_session['state'] = state return render_template('login.html', STATE=state)
count += 1 submission_id = comment['link_id'][3:] comment_created = datetime.utcfromtimestamp(comment['created_utc']) db_submission = database.session.query(Submission).filter_by( submission_id=submission_id).first() if db_submission is None: db_submission = Submission(submission_id=submission_id, created=comment_created, is_restricted=False) database.session.add(db_submission) db_user = database.session.query(User).filter_by( name=comment['author']).first() if db_user is None: db_user = database.session.merge(User(name=comment['author'])) if database.session.query(Comment).filter_by( comment_id=comment['id']).first() is not None: log.info(f"{count} : {(comment_created.strftime('%Y-%m-%d'))}") log.info(f"Found existing comment, exiting") database.session.commit() database.engine.dispose() sys.exit() db_comment = database.session.merge( Comment(comment_id=comment['id'], author=db_user, submission=db_submission, created=comment_created))
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker import json from database import Base, Product, Catalog, User, Global_catalog import os __location__ = os.path.realpath( os.path.join(os.getcwd(), os.path.dirname(__file__))) engine = create_engine('postgresql://*****:*****@localhost/ecommerce') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) session = DBSession() session.add(User(name='Mark', email='*****@*****.**')) session.commit() with open(os.path.join(__location__, 'ecommerce_output.json'), 'r') as f: products_dict = json.load(f) session.query(Product).delete() session.query(Catalog).delete() session.query(Global_catalog).delete() # Add global catalogs for product in products_dict: global_catalog_query = session.query(Global_catalog).filter_by( name=product['global_category']).count() if global_catalog_query: print("global catalog exists") continue else:
def createUser(email, name, pic): session.add(User(email=email, name=name, pic=pic)) session.commit() user = session.query(User).filter_by(email=email).one() return user
from sqlalchemy import create_engine, desc from sqlalchemy.orm import sessionmaker from database import Base, Category, Item, User engine = create_engine('sqlite:///CatalogApp.db') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) dbsession = DBSession() user = User(username="******") user.password = user.hash_password("admin") dbsession.add(user) dbsession.commit() cat = Category(name="Soccer") dbsession.add(cat) dbsession.commit() newItem = Item(name="Ball", category_id=cat.id, description="A round and black object") dbsession.add(newItem) dbsession.commit() newItem = Item(name="Pitch", category_id=cat.id, description="A vast area for playing") dbsession.add(newItem) dbsession.commit() newItem = Item(name="Shoes", category_id=cat.id, description="An item wore in feet to facilitate running")
def go_to_state(message, state_name: str, user: User): user.state = state_name user.save() get_state_and_process(message, user, is_entry=True)
from database import Base, User, Gallery engine = create_engine('sqlite:///Webpage.db') Base.metadata.create_all(engine) Base.metadata.bind = engine DBSessionMaker = sessionmaker(bind=engine) dbSession = DBSessionMaker() ### These are the commands you just saw live. marvin = User(firstname='Marvin', lastname='Arnold', email='*****@*****.**', username='******', password='******', nationality='American', gender='male', date='14/12', bio='I like tacos and football', profilepic='pretty picture') # This deletes everything in your database. dbSession.query(User).delete() dbSession.commit() # This adds some rows to the database. Make sure you `commit` after `add`ing! dbSession.add(marvin) dbSession.commit()
#este script solo corre por linea de comandos import os from getpass import getpass from database import User, File, session user_name = raw_input('ingrese el nombre de usuario ') user_pass = getpass('ingrese la clave de usuario ') confirm = raw_input('confirma creacion?(s/n) ') if confirm == 's': try: d = User(name=user_name, passw=user_pass) s = session() s.add(d) s.commit() os.system('mkdir uploads/' + user_name) print('directorio creado con exito') except: print('no se pudo crear el directorio') else: print('operacion cancelada')
def get_user(self, email, password): getuser_command = 'GETUSER ' + str(email) + ' ' + str(password) code, user_id = self.docmd(getuser_command) return User(user_id,email,password)
def gconnect(): """Google Oauth2 connection implementation""" # Validate state token if request.args.get('state') != login_session['state']: response = make_response(json.dumps('Invalid state parameter.'), 401) response.headers['Content-Type'] = 'application/json' return response # Obtain authorization code code = request.data try: # Upgrade the authorization code into a credentials object oauth_flow = flow_from_clientsecrets('client_secrets.json', scope='') oauth_flow.redirect_uri = 'postmessage' credentials = oauth_flow.step2_exchange(code) except FlowExchangeError: response = make_response( json.dumps('Failed to upgrade the authorization code.'), 401) response.headers['Content-Type'] = 'application/json' return response # Check that the access token is valid. access_token = credentials.access_token url = ('https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=%s' % access_token) h = httplib2.Http() a = h.request(url, 'GET')[1] result = json.loads(a.decode('utf-8')) # If there was an error in the access token info, abort. if result.get('error') is not None: response = make_response(json.dumps(result.get('error')), 500) response.headers['Content-Type'] = 'application/json' return response # Verify that the access token is used for the intended user. gplus_id = credentials.id_token['sub'] if result['user_id'] != gplus_id: response = make_response( json.dumps("Token's user ID doesn't match given user ID."), 401) response.headers['Content-Type'] = 'application/json' return response # Verify that the access token is valid for this app. if result['issued_to'] != CLIENT_ID: response = make_response( json.dumps("Token's client ID does not match app's."), 401) response.headers['Content-Type'] = 'application/json' return response stored_credentials = login_session.get('credentials') stored_gplus_id = login_session.get('gplus_id') if stored_credentials is not None and gplus_id == stored_gplus_id: response = make_response(json.dumps('Current user ' 'is already connected.'), 200) response.headers['Content-Type'] = 'application/json' return response # Store the access token in the session for later use. login_session['access_token'] = credentials.access_token login_session['gplus_id'] = gplus_id # Get user info userinfo_url = "https://www.googleapis.com/oauth2/v1/userinfo" params = {'access_token': credentials.access_token, 'alt': 'json'} answer = requests.get(userinfo_url, params=params) data = answer.json() login_session['username'] = data['name'] login_session['picture'] = data['picture'] login_session['email'] = data['email'] a = session.query(User).all() if not session.query(User).filter_by(name=login_session['email']).all(): flash("Welcome!") newUser = User(name=login_session['email']) session.add(newUser) session.commit() output = '' output += '<h1>Welcome, ' output += login_session['username'] output += '!</h1>' output += '<img src="' output += login_session['picture'] output += """ " style = "width: 300px; height: 300px;border-radius: 150px;-webkit-border-radius: 150px;-moz-border-radius: 150px;"> """ flash("you are now logged in as %s" % login_session['username']) return output
def find_or_create_user(email, name): user = User.query.filter_by(email=email).first() return user if user else User(email=email, name=name)
async def create_user( user_request: UserRequestModel ): # Asi indicamos que si un cliente quiere realizar una peticion a esta url tiene que enviar obligatoriamente los valores para crear un objeto de userRequestModel user = User.create(username=user_request.username, email=user_request.email) return user_request
class EventText(threading.Thread): bot_id = None user_id = None group_id = None message = None reply_token = None sticker = None image = None def __init__(self, **argv): threading.Thread.__init__(self) self.__dict__.update(**argv) self.bot = bots.get(self.bot_id, None) #User 模組 self.user = User.query.get(self.user_id) if self.user_id else None if self.user_id: if not self.user: self.user = User(self.user_id) db.session.add(self.user) #Group 模組 self.group = Group.query.get(self.group_id) if self.group_id else None if self.group_id: if not self.group: self.group = Group(self.group_id) db.session.add(self.group) self.group._json() #mariaDB還沒有支援json格式 只好自行轉換 #GroupUser 模組 self.group_data = GroupUser.query.filter_by( gid=self.group_id, uid=self.user_id).first() if self.group_id else None if self.group_id: if not self.group_data: self.group_data = GroupUser(self.group_id, self.user_id) db.session.add(self.group_data) self.group_data._json() #mariaDB還沒有支援json格式 只好自行轉換 #文本分類 if self.message: self.message = self.message.replace('"', '"').replace( "'", '’').replace(';', ';') #替換一些字元成全型 防SQL注入攻擊 self.order, *self.value = self.message.split('=') self.order = self.order.lower() self.key = self.value[0].strip(' \n') if len( self.value) > 0 else None self.value = '='.join( self.value[1:]).strip(' \n') if len(self.value) > 1 else None if self.key == '': self.key = None if self.value == '': self.value = None def _count(self, values): ''' 使用者對話計數 values只接受dict 由於使用中文 不用**argv ''' if self.group is None: return for key, value in values.items(): if key in self.group_data.count: self.group_data.count[key] += value else: self.group_data.count[key] = value def run(self): ''' 臨時中界層 ''' try: self.run2() except Exception as e: app.logger.error('ERROR') try: push_developer('<愛醬BUG>\n%s' % str(e)) self.bot.push(self.group.id, '愛醬出錯了!\n作者可能會察看此錯誤報告', reply_token=self.reply_token) except: print('傳送失敗') db.session.commit() raise e def run2(self): ''' 接收發送訊息邏輯 ''' if self.message: uid = '%s%s' % (self.user_id[1:5] if self.user_id else self.user_id, '@%s' % self.group_id if self.group else '') app.logger.info('%s > %s' % (uid, self.message)) t0 = time() reply_message = self.index() t1 = time() - t0 #公告 if reply_message is None: reply_message = [] elif type(reply_message) == str: reply_message = [reply_message] if not self.bot: if self.group: for message in reply_message: MessageQueue.add(self.group.id, message) else: if self.bot.push(self.group.id if self.group else self.user.id, reply_message, reply_token=self.reply_token): t2 = time() - t1 - t0 app.logger.info('%s < %s %s' % (uid, reply_message, '(%dms, %dms)' % (t1 * 1000, t2 * 1000))) elif self.sticker: reply_message = [] self._count({'貼圖': 1}) elif self.image: reply_message = [] self._count({'圖片': 1}) if not self.group: try: content = imgur.uploadByLine(self.bot, self.message_id) except Exception as e: content = str(e) self.bot.push(self.user.id, content, reply_token=self.reply_token, format=False) #刷新資料 if self.user: try: self.user.name = self.bot.get_group_member_profile( self.group.id, self.user.id).display_name except: try: self.user.name = self.bot.get_room_member_profile( self.group.id, self.user.id).display_name except: pass self.user.update() if self.group: self.group.update() self.group_data.update() db.session.commit() return reply_message def index(self): if self.group: #群組才有的功能 if self.order in ['-s', 'set', 'settings', '設定', '設置']: return self.settings() elif self.order in ['愛醬安靜', '愛醬閉嘴', '愛醬睡覺', '愛醬下線']: return self.sleep() elif self.order in [ '愛醬講話', '愛醬說話', '愛醬聊天', '愛醬起床', '愛醬起來', '愛醬上線' ]: return self.wake_up() elif self.order in ['log', 'logs', '紀錄', '回憶']: return self.logs() else: #1對1才有的功能 pass if self.order in ['-?', '-h', 'help', '說明', '指令', '命令']: return text['指令說明'] elif self.order in ['公告']: return self.push() elif self.order in ['-w', 'web', '網頁設定', '網頁設置']: return self.web() elif self.order in ['-l', 'list', '列表']: return self.list() elif self.order in ['-a', 'add', 'keyword', '新增', '關鍵字', '學習']: return self.add() elif self.order in ['-a+', 'add+', 'keyword+', '新增+', '關鍵字+', '學習+']: return self.add_plus() elif self.order in ['-d', 'delete', 'del', '刪除', '移除']: return self.delete() elif self.order in ['-o', 'opinion', '意見', '建議', '回報', '檢舉']: return self.opinion() elif self.order in ['google', 'goo']: return self.google() elif self.order in []: #'飆車' return self.bt() elif self.order in []: #'停車' return self.bt_stop() elif self.order in ['e-hentai', 'ehentai', 'e變態']: return self.ehentai() elif self.order in ['exhentai', 'ex變態']: return self.exhentai() elif self.order in ['pixiv', '#pixiv', 'p網', '#p網']: return self.pixiv() elif self.order in ['weather', '天氣']: return self.weather() else: return self.main() def push(self): if self.user_id != cfg['developer']: return cfg['公告']['內容'] if self.value is None: return '參數錯誤\n[公告=對象id or all=內容]' if self.key == 'all': for g in Group.query.all(): MessageQueue.add( g.id, '<愛醬公告 %s>\n詳細說明 goo.gl/KutKhs\n%s' % (datetime.now().strftime('%m%d.%H'), self.value)) else: MessageQueue.add(self.key, '<開發者回覆>\n' + self.value) return 'ok' def sleep(self): ''' 愛醬閉嘴 ''' h = int(self.key) if self.key and self.key.isdigit() else 12 t = time() + 60 * 60 * (24 * 7 if h > 24 * 7 else 1 if h < 1 else h) UserSettings_temp.set(self.group_id, '暫停', str(t)) UserSettings_temp.save() return '%s\n(%s)' % ( text['睡覺'], datetime.fromtimestamp(t).strftime('%Y-%m-%d %H:%M')) def wake_up(self): ''' 愛醬說話 ''' if UserSettings_temp.has_option(self.group_id, '暫停'): UserSettings_temp.remove_option(self.group_id, '暫停') UserSettings_temp.save() return text['睡醒'] else: return text['沒睡'] def web(self): ''' 網頁設定 ''' if not self.user: return text['權限不足'] if self.group: u = WebUI.query.get(self.user.id) if not u: u = WebUI(self.user.id) db.session.add(u) u.setGroup(self.group.id, 60 * 30) return '%s\n授權操作此群組30分鐘' % (cfg['web_url']) else: return cfg['web_url'] def list(self): ''' 列出關鍵字 ''' reply_message = [] #list的排列需要調整 目前來看一行20個字為佳 if self.group is None or self.key in cfg['詞組']['自己的']: if self.user is None: return text['權限不足'] else: reply_message.append('現在群組中預設不使用個人詞庫\n有需要請用「設定」開啟') reply_message.append('\n'.join( [k.keyword for k in UserKeyword.get(self.user.id)])) else: reply_message.append('「列表=我」查詢自己') reply_message.append('\n'.join( [k.keyword for k in UserKeyword.get(self.group.id)])) reply_message.append('\n\n使用「網頁設定」更好操作') return '\n'.join(reply_message) def add(self, plus=False): ''' 新增關鍵字 ''' if self.key is None: return text['學習說明'] #文字處理1 self.key = self.key.lower() while '***' in self.key: self.key = self.key.replace('***', '**') #查詢 if self.value is None: if self.group: row = UserKeyword.get(self.group.id, self.key) else: row = UserKeyword.get(self.user.id, self.key) if row: return text_format(text['關鍵字查詢成功'], key=self.key, value=row.reply) else: return text_format(text['關鍵字查詢失敗'], key=self.key) self._count({'調教': 1}) #紀錄次數 #文字處理2 while '|||' in self.value: self.value = self.key.replace('|||', '||') while '___' in self.value: self.value = self.key.replace('___', '__') #新增 ban_key = ['**', '** **', '愛醬**', '**愛醬**'] if self.key in ban_key: return '%s\n%s' % (text['關鍵字禁用'], text['分隔符'].join(ban_key)) if self.value[:2] == '##': return '由於規則問題 沒辦法使用##開頭的內容喔' if self.key != text['名稱'] and self.key[:2] == text['名稱']: self.key = self.key[2:].strip(' \n') #保護模式過濾 之後option寫入database將此邏輯合併計算中 n = self.value.rfind('##') if n > -1 and '保護' in self.value[ n:] and self.key[:2] == '**' and self.key[-2:] == '**': return '為了避免過度觸發\n保護模式關鍵字不接受前後**喔' reply_message = [ '%s 新增 <%s> ' % (self.user.name if self.user else '', self.key) ] try: if self.group: UserKeyword.add_and_update(self.group_id, self.user_id, self.key, self.value, plus=plus) else: UserKeyword.add_and_update(self.user_id, self.user_id, self.key, self.value, plus=plus) except Exception as e: return '學習失敗: %s' % str(e) level = len(self.key) - self.key.count('**') * ( len('**') + 1) #database的UserKeyword.level 懶得改上面 if level < 0: reply_message.append('\n愛醬非常不建議這種會過度觸發的詞喔\n請慎用') elif level == 0: reply_message.append('\n這種容易觸發的詞容易造成過多訊息喔\n請注意使用') elif level >= 7: reply_message.append('\n這種詞命中率較低喔 請善加利用萬用字元雙米號') if '*' in self.key and '**' not in self.key: reply_message.append( '\n愛醬發現你似乎要使用萬用字元?\n如果是的話請把 *(單米號) 換成 **(雙米號)') if '_' in self.value and self.value.count('__') == 0: reply_message.append( '\n愛醬發現你似乎要使用隨機模式?\n如果是的話請把 _(單底線) 換成 __(雙底線)') #for i in self.value.replace('__', '||').split('||'): # i = i.strip() # if i[:4] == 'http' and not is_image_and_ready(i): # reply_message.append('<%s>\n愛醬發現圖片網址是錯誤的\n請使用格式(jpg, png)\n短網址或網頁嵌圖片可能無效\n必須使用https' % i) # break #如果全部都檢查時間會太久 只幫第一個檢查格式 通常使用者圖床也會使用同一個 應該不會有問題 if self.group is None: reply_message.append( '\n現在個人詞庫預設是不會在群組觸發的喔\n請在群組設定開啟全回應模式(預設開)或開啟個人詞庫(預設關)') else: #保護模式提醒 之後option寫入database將此邏輯合併計算中 n = self.value.rfind('##') if n > -1 and '保護' in self.value[n:]: reply_message.append('\n(此為保護關鍵字 只有你可以刪除及修改 為了避免爭議 建議不要濫用)') return ''.join(reply_message) \ + '\n\n使用「網頁設定」更好操作' def add_plus(self): ''' 新增關鍵字(疊加) ''' if self.key is None: return text['學習說明+'] return self.add(plus=True) def delete(self): ''' 刪除關鍵字 ''' if self.key is None: return '格式:\n刪除=<關鍵字>' self._count({'調教': 1}) #紀錄次數 if self.key != text['名稱'] and self.key[:2] == text['名稱']: self.key = self.key[2:].strip(' \n') self.key = self.key.lower() reply_message = [ '%s 刪除 <%s>' % (self.user.name if self.user else '', self.key) ] try: if self.group: if UserKeyword.delete(self.group_id, self.user_id, self.key): reply_message.append(' 成功') if self.user: if UserKeyword.delete(self.user_id, self.user_id, self.key): reply_message.append(' 成功') except Exception as e: return '刪除失敗: %s' % str(e) return ''.join(reply_message) if len(reply_message) > 1 else '喵喵喵? 愛醬不記得<%s>' % (self.key) \ + '\n\n使用「網頁設定」更好操作' def opinion(self): ''' 回報、建議、檢舉 ''' if self.key is None: return text['回報說明'] self._count({'觸發': 1}) #紀錄次數 try: push_developer( '%s\n%s\n%s\n%s' % (self.bot_id, self.group_id, self.user_id, self.message)) return text['回報完成'] except Exception as e: raise e return '訊息傳送失敗..%s' % str(e) def settings(self): ''' 設定 ''' if self.key is None: return [ '設定=別理我=開/關\n' '設定=個人詞庫=開/關\n' '設定=全回應=開/關\n' '設定=全圖片=開/關(需要全回應)\n' '設定=幫忙愛醬=開/關\n' '\n' '(不輸入值可查看說明)', UserSettings.show(self.group_id, self.user_id) ] try: if self.key in ['過濾髒話', '髒話過濾']: return '這設定已經移除了' #全群組 if self.key == '全回應': if self.value is None: return '開啟後愛醬開頭的對話將從全部的詞庫中產生反應\n「預設:關」' UserSettings.update(self.group_id, None, {'全回應': text2bool(self.value)}) return '設定完成' if self.key == '全圖片': if self.value is None: return '開啟後全回應的結果包含圖片\n(需要開啟全圖片)\n(注意:圖片沒有任何審核 有可能出現不適圖片 如可接受再開啟)\n「預設:關」' UserSettings.update(self.group_id, None, {'全圖片': text2bool(self.value)}) return '設定完成' if self.key == '幫忙愛醬': if self.value is None: return '開啟後會快取群組的對話紀錄\n只用於機器學習\n作者會稍微過目後進行分類丟入程式\n用完後刪除「預設:關」\n使用「設定=幫忙愛醬=開」開啟' UserSettings.update(self.group_id, None, {'幫忙愛醬': text2bool(self.value)}) return '設定完成' #群組中個人 if self.key == '別理我': if self.value is None: return '開啟後愛醬不會在此群組對你產生回應\n(愛醬開頭還是可以強制呼叫)\n「預設:關」' if self.user_id is None: return text['權限不足'] UserSettings.update(self.group_id, self.user_id, {'別理我': text2bool(self.value)}) return '設定完成' if self.key == '個人詞庫': if self.value is None: return '開啟後會對你的個人詞庫產生回應\n「預設:關」' if self.user_id is None: return text['權限不足'] UserSettings.update(self.group_id, self.user_id, {'個人詞庫': text2bool(self.value)}) return '設定完成' return '沒有此設定喔' except Exception as e: return '設定錯誤 <%s>' % str(e) def logs(self): ''' 回憶模式 ''' score_default = { '調教': 30, '觸發': 10, '對話': 1, '貼圖': 1, '圖片': 1, '網頁': 0.5, '髒話': -10, '字數': 0.1, } def _score(group_data): score = 0 for key, value in score_default.items(): score += group_data.count.get(key, 0) * self.group.count.get( key, value) return score def _get(user): group_data = GroupUser.query.filter_by(gid=self.group.id, uid=user.id).first() if group_data is None: group_data = GroupUser(self.group.id, user.id) db.session.add(group_data) group_data._json() score = _score(group_data) return '\n'.join([ '愛醬記得 %s' % (user.name if user.name else '你'), '調教愛醬 %d 次' % (group_data.count.get('調教', 0)), '跟愛醬說話 %d 次' % (group_data.count.get('觸發', 0)), '有 %d 次對話' % (group_data.count.get('對話', 0)), '有 %d 次貼圖' % (group_data.count.get('貼圖', 0)), '有 %d 次圖片' % (group_data.count.get('圖片', 0)), '有 %d 次傳送門' % (group_data.count.get('網頁', 0)), '講過 %d 次「幹」' % (group_data.count.get('髒話', 0)), '總計 %d 個字' % (group_data.count.get('字數', 0)), '----------', '總分 %d' % (score if score > 0 else 0), ]) if is_text_like(self.key, '自己'): #查詢自己 if self.user is None: return text['權限不足'] if self.user.id not in self.group.count: self._count({}) #如果沒有任何紀錄刷新一筆空的進行初始化 return _get(self.user) elif self.key in ['rank', '排名', '排行']: #排行榜 rank = [] for row in GroupUser.query.filter_by(gid=self.group.id): if row.uid is None: continue user = User.query.get(row.uid) if user is None: continue row._json() score = _score(row) for u in rank[:10]: if score > u['score']: rank.insert(rank.index(u), { 'user': user, 'score': score }) break else: if len(rank) < 3: rank.append({'user': user, 'score': score}) if len(rank) < 3: return '群組說話的不足3人\n(沒有權限等同不存在)' n = 0 reply_message = [] for u in rank[:10]: n += 1 reply_message.append('第%s名 %s 分!\n%s ' % (n, int(u['score']), u['user'].name)) return '\n\n'.join(reply_message) elif is_text_like(self.key, '設定'): #設定分數 (查詢) values = [] for key, value in score_default.items(): values.append('%s = %s' % (key, self.group.count.get(key, value))) return '目前分數設定為:\n%s\n\n調整方法為\n「回憶=類型=值」\n栗子\n回憶=對話=5' % '\n'.join( values) elif self.key in list(score_default.keys()): #設定分數 if not isFloat(self.value): return '<%s>不是數字喔' % (self.value) self.group.count[self.key] = float(self.value) return '設定完成' elif is_text_like(self.key, '全部'): #查詢整群 total = {}.fromkeys( ['人數', '調教', '觸發', '對話', '貼圖', '圖片', '網頁', '髒話', '字數'], 0) for row in GroupUser.query.filter_by(gid=self.group.id): row._json() total['人數'] += 1 for key in score_default.keys(): total[key] += row.count.get(key, 0) return '\n'.join([ '愛醬記得這個群組...', '有 %d 個人說過話' % total['人數'], '愛醬被調教 %d 次' % (total['調教']), '跟愛醬說話 %d 次' % (total['觸發']), '有 %d 次對話' % (total['對話']), '有 %d 次貼圖' % (total['貼圖']), '有 %d 次圖片' % (total['圖片']), '有 %d 次傳送門' % (total['網頁']), '講過 %d 次「幹」' % (total['髒話']), '總計 %d 個字' % (total['字數']), ]) elif self.key: #查詢別人 users = {} self.key = self.key.strip('@ \n') for row in GroupUser.query.filter_by(gid=self.group.id): if row.uid is None: continue user = User.query.get(row.uid) if user is None or user.name is None: continue if self.key == user.name: return _get(user) if self.key in user.name: users[user.id] = user if len(users) == 0: return '找不到 <%s>\n可能是\n1.名稱輸入錯誤\n2.該人沒有說過話\n3.權限不足' % ( self.key) if len(users) > 1: return '查詢到 %s 人\n請輸入更完整的名稱' % (len(users)) return _get(list(users.values())[0]) return '\n'.join([ '「回憶=我」 查詢自己', '「回憶=全部」 查詢全部', '「回憶=<名字>」查詢別人', '「回憶=設定」 查詢設定', '(吐嘲暫時移除)', ]) def google(self): ''' google搜尋 ''' if self.key is None: return text['google說明'] self._count({'觸發': 1}) #紀錄次數 return google_search(self.message[self.message.find('=') + 1:]) def bt(self): ''' BT直播功能 ''' return '目前此功能關閉' def bt_stop(self): ''' BT直播功能 停止 ''' return '目前此功能關閉' def ehentai(self): ''' E變態搜尋 ''' if self.key is None: return text['ehentai說明'] self._count({'觸發': 1}) #紀錄次數 return ehentai_search(self.key) def exhentai(self): ''' EX變態搜尋 ''' if self.key is None: return text['exhentai說明'] self._count({'觸發': 1}) #紀錄次數 return exhentai_search(self.key) def pixiv(self): if self.order[0] == '#': if self.key is None: return text['pixiv#說明'] return pixiv.rss(self.key) else: if self.key is None: return text['pixiv說明'] return pixiv.search( self.key, self.value if self.value is not None and self.value.isdigit() else 30) def weather(self): try: weather = get_weather(self.user, self.key) self._count({'觸發': 1}) #紀錄次數 return weather except Exception as e: raise Exception('天氣查詢失敗: %s' % str(e)) def main(self): ''' 關鍵字觸發 ''' if 'http:' in self.message or 'https:' in self.message: #如果內容含有網址 做網址檢查 if self.group: self._count({'網頁': 1}) #紀錄次數 return google_safe_browsing(self.message) else: return google_shorten_url(self.message) #短網址 self.message = self.message.lower().strip(' \n') #調整內容 以增加觸發命中率 self._count({ '對話': 1, '髒話': self.message.count('幹') + self.message.count('f**k'), '字數': len(self.message), }) if self.message == '': return None #暫存訊息 用於對話模型訓練 if self.group: with open('E:\\bot_log\\%s.log' % self.group_id, 'a+', encoding='utf-8') as f: f.write(self.message + '\n') #愛醬開頭可以強制呼叫 if self.group: if self.message != text['名稱'] and self.message[:2] == text['名稱']: message_old = self.message self.message = self.message[2:].strip(' \n ') reply_message = self.check(UserKeyword.get(self.group_id)) if reply_message: return reply_message reply_message = self.check(UserKeyword.get(self.user_id)) if reply_message: return reply_message self.message = message_old #睡覺模式 if UserSettings_temp.has_option(self.group_id, '暫停'): if time() > UserSettings_temp.getfloat(self.group_id, '暫停'): UserSettings_temp.remove_option(self.group_id, '暫停') UserSettings_temp.save() return text['睡醒'] #一般模式 else: if not self.group or (self.user and UserSettings.get( self.group.id, self.user.id, '個人詞庫', False)): #檢查是否使用個人詞庫 reply_message = self.check(UserKeyword.get(self.user.id)) if reply_message: return reply_message if self.group and self.user: if not UserSettings.get(self.group.id, self.user.id, '別理我', False): #檢查不理我模式 reply_message = self.check(UserKeyword.get(self.group.id)) if reply_message: return reply_message #全回應模式 if self.message[:2] == text['名稱'] or self.group_id is None: if self.group is None or UserSettings.get( self.group_id, None, '全回應', default=False): if self.message != text['名稱'] and self.message[:2] == text[ '名稱']: #做兩層是為了方便1對1不見得也要愛醬開頭 self.message = self.message[2:].strip(' \n ') reply_message = self.check(UserKeyword.get(), all_reply=True) if reply_message: return reply_message if self.group: return choice(text['未知']) else: return choice(text['未知']) + '\n(全回應模式關閉)\n使用「設定」開啟' if self.group_id is None: return text['預設回覆'] else: return None def check(self, userkeyword_list, all_reply=False): ''' 關鍵字觸發的邏輯檢查 ''' exclude_url = all_reply and not (not self.group or UserSettings.get( self.group.id, None, '全圖片', default=False)) keys = [] result = [] for row in userkeyword_list: row_reply = row.reply if row_reply[:1] == '@': #全回應模式過濾開頭@ if all_reply: continue else: row_reply = row.reply[1:] if exclude_url and 'https:' in row_reply: #全回應模式過濾網址只排除可能是圖片類型的 continue if row.keyword == self.message: if all_reply: result.append(row_reply) else: return self.later(row_reply) elif row.keyword.replace('**', '') == self.message: result.append(row_reply) elif not all_reply or len(row_reply) > 1: #超過一個字才加入全回應 keys.append((row.keyword, row_reply)) if len(result) > 0: return self.later(choice(result)) #結果集隨機抽取一個 results = {} result_level = -99 for k, v in keys: try: kn = -1 k_arr = k.split('**') for k2 in k_arr: if k2 != '': n = self.message.find(k2) if n > kn: kn = n else: break #最後檢查前後如果為任意字元的情況 那相對的最前最後一個字元必須相等 雖然使用字串會比較精準 暫時先用一個字元 如果**混在中間有可能誤判 但是問題不大 if k_arr[0] != '' and self.message[0] != k[0]: break if k_arr[-1] != '' and self.message[-1] != k[-1]: break else: #result.append(v) level = len(k) - k.count('**') - (2 if k[:2] == '**' else 0) - (2 if k[-2:] == '**' else 0) if not level in results: results[level] = [] if level > result_level: result_level = level results[level].append(v) except Exception as e: bots['admin'].send_message( cfg['admin_line'], '錯誤:%s\ngid:%s\nuid:%s\nmsg:%s\nkey:<%s>\n<%s>' % (str(e), self.group_id, self.user_id, self.message, k, v)) raise e if len(results) > 0: return self.later(choice(results[result_level])) return None def later(self, reply_message): ''' 關鍵字觸發的後處理 ''' self._count({'觸發': 1}) #取參數 opt = {} if '##' in reply_message: reply_message_new = [] for i in reply_message.split('##'): if '=' in i: a, *b = i.split('=') opt[a] = '='.join(b) else: reply_message_new.append(i) #reply_message = ''.join(reply_message_new) reply_message = reply_message[:reply_message.find( '##')] #參數之後會由add儲存至database 這邊之後會廢棄 #隨機 (算法:比重) if '__' in reply_message: weight_total = 0 result_pool = {} minimum_pool = [] for msg in reply_message.split('__'): if msg == '': continue index = msg.rfind('%') if index > -1 and isFloat(msg[index + 1:].strip()): #if index > -1 and msg[index+1:].strip().isdigit(): weight = float(msg[index + 1:].strip()) msg = msg[:index] else: weight = 1 weight_total += weight is_minimum = msg[:1] == '*' if is_minimum: is_minimum_pool = msg[:2] == '**' msg = msg[2:] if is_minimum_pool else msg[1:] result_pool[msg] = { 'weight': weight, 'is_minimum': is_minimum, } if is_minimum and is_minimum_pool: minimum_pool.append(msg) if opt.get('百分比', '0').isdigit(): #百分比隨機模式 number = int(opt.get('百分比', '0')) if number > 0: reply_message = [] total = 100.0 if number > len(result_pool): number = len(result_pool) result_pool = sample( [msg for msg, msg_opt in result_pool.items()], number) n = 0 for msg in result_pool: n += 1 if n >= number or n >= len(result_pool): ratio = total total = 0 else: ratio = uniform(0, total) total -= ratio reply_message.append('%s(%3.2f%)' % (msg, ratio)) if total <= 0: break return '\n'.join(reply_message) count = int( self.message[self.message.rfind('*') + 1:] ) if '*' in self.message and self.message[self.message.rfind('*') + 1:].isdigit() else 1 if count > 10000: count = 10000 if count < 1: count = 1 if count == 1 and '種子' in opt and opt['種子'].isdigit() and int( opt['種子']) > 0: seed_time = int((datetime.now() - datetime(2017, 1, 1)).days * 24 / int(opt['種子'])) seed = int( md5((str(self.user_id) + str(seed_time) ).encode()).hexdigest().encode(), 16) % weight_total else: try: #random.org的隨機據說為真隨機 if count > 1: r = requests.get( 'https://www.random.org/integers/?num=%s&min=0&max=%s&col=1&base=10&format=plain&rnd=new' % (count, int(weight_total)), timeout=3) if 'Error' in r.text: raise seed = r.text.split('\n')[:-1] else: raise except: seed = [ uniform(0, int(weight_total)) for i in range(count) ] minimum_count = 0 minimum_index = int(opt.get('保底', 10)) reply_message_new = {} reply_message_image = [] for i in range(count): #r = uniform(0, weight_total) if seed == -1 else seed r = float(seed[i]) if type(seed) == list else seed for msg, msg_opt in result_pool.items(): if r > msg_opt['weight']: r -= msg_opt['weight'] else: minimum_count = 0 if msg_opt[ 'is_minimum'] else minimum_count + 1 if minimum_count >= minimum_index and len( minimum_pool) > 0: minimum_count = 0 msg = choice(minimum_pool) if msg[:6] == 'https:': reply_message_image.append(msg) if len(reply_message_image) > 5: break else: reply_message_new[msg] = ( reply_message_new[msg] + 1) if msg in reply_message_new else 1 break if len(reply_message_new) > 0: if count == 1: reply_message = list(reply_message_new.keys()) else: reply_message = [] for msg, num in reply_message_new.items(): reply_message.append('%s x %s' % (msg, num)) reply_message = ['\n'.join(reply_message)] else: reply_message = [] reply_message.extend(reply_message_image[:5]) #這邊有待優化 if type(reply_message) == str: reply_message = [reply_message] reply_message_new = [] for msg in reply_message: for msg_split in msg.split('||'): reply_message_new.append(msg_split) return reply_message_new
def catalog(name, user_id): catalog = Catalog(name=name, user_id=user_id) session.add(catalog) session.commit() return catalog def item(name, catalog_id, description): item = Item(name=name, catalog_id=catalog_id, description=description) session.add(item) session.commit() return item author = User(name="iHDeveloper", email="*****@*****.**", picture="test_picture") session.add(author) session.commit() mouses = catalog("Mouses", author.id) mouses_v1 = item("Mouse V1", mouses.id, "The first version of the mouse item.") mouses_v1 = item("Mouse V2", mouses.id, "The second version of the mouse item.") keyboards = catalog("Keyboard", author.id) keyboard_v1 = item("KeyBoard V1", keyboards.id, "The first version of keyboard") keyboard_v1 = item("KeyBoard V2", keyboards.id, "The second version of keyboard")
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from database import Cheese, Base, CheeseItem, User engine = create_engine('sqlite:///cheesewithuser.db') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) session = DBSession() # creating user user1 = User(name="admin", email="*****@*****.**") session.add(user1) session.commit() # cheese country1 cheese1 = Cheese(name="Asian cheese", user_id=1) session.add(cheese1) session.commit() # cheese Item1 cheeseItem1 = CheeseItem(name="Chhana cheese", description="A fresh, unripened" "curd cheese made from cow or water buffalo milk", price="$25", cheese=cheese1, user_id=1) session.add(cheeseItem1) session.commit() # cheese item2 cheeseItem2 = CheeseItem(name="Kalari cheese", description="Also known as" "Kiladi or Maish Krej from Kashmiri", price="$30", cheese=cheese1, user_id=1) session.add(cheeseItem2)
from database import Base, User, Category, Item # Create new db session engine = create_engine('sqlite:///catalog.db') Base.metadata.bind = engine DBSession = sessionmaker(bind=engine) session = DBSession() print("Session successfully created!") # Create a test user user1 = User( id=7, name="John Snow", email="*****@*****.**", picture= 'https://pbs.twimg.com/profile_images/901947348699545601/hqRMHITj_400x400.jpg' ) session.add(user1) session.commit() ''' #### Football #### ''' football = Category(name="Football") session.add(football) session.commit()
def user_age(id, charset='utf-8'): return json.loads(User.objects(id=id).to_json())
def add_user(username): user = User(username, username + "@gmail.com") db.session.add(user) db.session.commit() return "Added " + username
def user_signup(body, charset='utf-8'): user = User(**body) user.save() return json.loads(user.to_json())
def edit_style(cb): bot.answer_callback_query(cb.id) painter_model = FigurePlotterModel.get_or_none( creator=cb.from_user.id, ) config = painter_model.style_config if cb.data == 'proceed-shapes': shape = painter_model.current_shape for k, v in config.items(): setattr(shape, k, v) shape.process_colors() painter_model.shapes.append(shape) painter_model.save() painter = FigurePlotterModel.get_painter(cb.from_user.id) painter.add_shape(shape) filename = painter.save_figure() bot.send_photo( cb.from_user.id, open(filename, 'rb').read(), caption="Here is your painting at the moment!" ) bot.send_message( cb.from_user.id, 'Choose type of your future shape', reply_markup=get_shapes_markup() ) User.set_state( cb.from_user.id, State.CHOOSING_SHAPE ) return resp = '' new_state = State.EDITING_STYLE if cb.data in ['fill', 'stroke']: config[cb.data] ^= True elif cb.data == 'fill_color': resp = "Choose fill color" new_state = State.SETTING_FILL_COLOR elif cb.data == 'stroke_color': resp = "Choose stroke color" new_state = State.SETTING_STROKE_COLOR elif cb.data == 'stroke_width': resp = "Choose stroke width" new_state = State.SETTING_STROKE_WIDTH if resp: bot.delete_message( cb.from_user.id, cb.message.message_id ) bot.send_message( cb.from_user.id, resp ) User.set_state( cb.from_user.id, new_state ) else: FigurePlotterModel.update( style_config=config ).where( FigurePlotterModel.creator == cb.from_user.id ).execute() bot.edit_message_reply_markup( cb.from_user.id, cb.message.message_id, reply_markup=get_shape_style_markup(**config) )