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()
예제 #3
0
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
예제 #4
0
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)
예제 #6
0
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()
예제 #7
0
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'
예제 #8
0
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)
예제 #11
0
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
예제 #14
0
파일: qvqweb.py 프로젝트: Nightsuki/QvQDNS
 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()
예제 #15
0
파일: main.py 프로젝트: b1naryth1ef/buildy
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()
예제 #17
0
 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")
예제 #18
0
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)
예제 #20
0
파일: demo.py 프로젝트: bewiwi/DemoInstance
    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
예제 #21
0
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
예제 #22
0
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))
예제 #24
0
파일: alfa.py 프로젝트: histrio/macaca
 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
예제 #25
0
파일: main.py 프로젝트: Ododo/flask-api
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)
예제 #26
0
    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()
예제 #27
0
파일: main.py 프로젝트: b1naryth1ef/buildy
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')
예제 #28
0
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)
예제 #30
0
파일: auth.py 프로젝트: zifnab06/zifb.in
    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
예제 #31
0
#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)
예제 #32
0
 def patch(self):
     args = detailV.parse_args()
     userId = request.environ['decoded']['id']
     result = User.updateById(userId, args)
     return result['data'], result['code']
예제 #33
0
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()
예제 #34
0
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'}
예제 #35
0
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(
예제 #36
0
 def test_select(self):
     a = User.create(username='******', password='******', email='piyo@com')
예제 #37
0
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()
예제 #40
0
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)
예제 #41
0
        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)
예제 #42
0
        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))
예제 #43
0
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:
예제 #44
0
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
예제 #45
0
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")
예제 #46
0
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)
예제 #47
0
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()
예제 #48
0
#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')
예제 #49
0
 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)
예제 #50
0
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
예제 #51
0
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)
예제 #52
0
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
예제 #53
0
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
예제 #54
0
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")
예제 #55
0
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()
예제 #57
0
def user_age(id, charset='utf-8'):
    return json.loads(User.objects(id=id).to_json())
예제 #58
0
def add_user(username):
    user = User(username, username + "@gmail.com")
    db.session.add(user)
    db.session.commit()
    return "Added " + username
예제 #59
0
def user_signup(body, charset='utf-8'):

    user = User(**body)
    user.save()

    return json.loads(user.to_json())
예제 #60
0
파일: bot.py 프로젝트: ghadd/plotgraphbot
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)
        )