Ejemplo n.º 1
0
	def __init__(self, angle, power, player, type):
		pygame.sprite.Sprite.__init__(self, self.containers)
		folder = 'dan'

		self.frame_rate = 1

		image_source = Utils.my_load_image(folder, type)

		self.images = []
		if type=='simple.png':
			self.images = Utils.load_frame(image_source, 0, 0, 30, 30, 0, 4)
		else:
			self.images = Utils.load_frame(image_source, 0, 0, 30, 28, 0, 4)

		self.frame_length = len(self.images)
		self.frame = 0
		self.image = self.images[int(round(self.frame))]
		self.rect = self.image.get_rect()

		self.speed_x = math.cos(math.radians(angle)) * power * 2 + 20
		self.speed_y = -math.sin(math.radians(angle)) * power * 2 + 50

		self.acceleration = Constant.GRAVITY
		self.t = 0
		self.start_x = player.pos[0]#centerx
		self.start_y = player.pos[1]#.centery - 70

		self.rect.move_ip(self.start_x, self.start_y)

		self.x = self.start_x
		self.y = self.start_y
		self.energy_cost = 10
		self.pos_creep_screen = -100
Ejemplo n.º 2
0
    def __init__(self, x, y, left, right, direction, speed_x):
        """
        Constructor
        :param x: position x in screen
        :param y: position y in screen
        :param direction: direction to move, 0 or 1
        :return:
        """
        BasicCreep.__init__(self, x, y, left, right)

        # Coefficients
        self.frame = 0

        self.move_speed_x = speed_x
        self.frame_rate = 0.8 * 0.25 * speed_x

        self.move_speed_y = 1
        self.direction = direction  # TODO Define enum
        if self.direction == 1:
            self.move_speed_x = -self.move_speed_x
        self.dis = 0
        self.left = left
        self.right = self.right

        # Status
        self.down_able = True

        image_source = Utils.my_load_image('creep', 'creep3.png')
        self.images_forward = Utils.load_frame(image_source, 0, 0, 131.5, 66,
                                               0, 4)
        images_forward_ex1 = Utils.load_frame(image_source, 0, 69, 129.3, 47,
                                              0, 3)
        images_forward_ex2 = Utils.load_frame(image_source, 0, 143, 131.5, 66,
                                              0, 4)
        images_forward_ex3 = Utils.load_frame(image_source, 0, 214, 129.3, 47,
                                              0, 3)
        for image in images_forward_ex1:
            self.images_forward.append(image)
        for image in images_forward_ex2:
            self.images_forward.append(image)
        for image in images_forward_ex3:
            self.images_forward.append(image)

        for i in range(len(self.images_forward) - 1, -1, -1):
            self.images_forward.append(self.images_forward[i])

        self.images_back = []
        for image in self.images_forward:
            self.images_back.append(pygame.transform.flip(image, 1, 0))

        self.frame_length = len(self.images_forward)

        self.image = self.images_forward[0]

        self.rect = self.image.get_rect()  # Default position at (0,0)
        self.rect.move_ip(x, y)
Ejemplo n.º 3
0
def game_over(screen,gamestate):
    pygame.mouse.set_visible(1)

    # #create the background, tile the bgd image
    bgdtile = Utils.load_image('gameover_back.jpg')
    background = pygame.Surface(Constant.SCREENRECT.size)
    for x in range(0, Constant.SCREENRECT.width, bgdtile.get_width()):
        background.blit(bgdtile, (x, 0))

    playagain = pygbutton.PygButton((380, 400, 100, 40), 'Play again')
    quit = pygbutton.PygButton((520, 400, 100, 40), 'Quit')

    while gamestate == Constant.GAMEOVER:
        for event in pygame.event.get():
            if event.type == QUIT or \
                (event.type == KEYDOWN and event.key == K_ESCAPE):
                    return
            if 'click' in playagain.handleEvent(event):
                gamestate = Constant.GAME
                if(gamestate == Constant.GAME):
                    CreepManager.init()
                    main(screen)
            if 'click' in quit.handleEvent(event):
                if pygame.mixer:
                    pygame.mixer.music.fadeout(1000)
                pygame.time.wait(1000)
                pygame.quit()
        screen.blit(background, (0,0))
        playagain.draw(background)
        quit.draw(background)
        pygame.display.flip()
Ejemplo n.º 4
0
    def UploadFile(self, strfileName, strFile, strFolder):
        try:
            strRemoteFileName = strfileName
            strURIRequest = self.strURIFile

            if strFolder == "":
                strURIRequest += strRemoteFileName
            else:
                strURIRequest += strFolder + "/" + strRemoteFileName

            signedURI = Utils.Sign(strURIRequest)

            Utils.uploadFileBinary(signedURI, strFile)

        except:
            raise "exception"
Ejemplo n.º 5
0
    def __init__(self):
        pygame.sprite.Sprite.__init__(self, self.containers)

        image_resource = Utils.my_load_image('nhan vat 2', 'dead.png')
        self.image = image_resource.subsurface(100, 550, 1200, 200)

        self.rect = self.image.get_rect(midbottom=Constant.SCREENRECT.midbottom)
        self.mask = pygame.mask.from_surface(self.image)
Ejemplo n.º 6
0
 def register_user(email, password):
     """
     This method registers a user using  e-mail and password.
     The password already come with sha-512 hash algorithm.
     :param email: user's email (might be invalid)
     :param password: sha512-hashed password
     :return: True if registered successfully, of False otherwise
     """
     userData = Database.find_one("users", {'email': email})
     if userData is not None:
         raise UserExistsError("user already existed!")
     #if email is invalid, then what?
     if not Utils.email_is_valid(email):
         raise UserEmailInvalid("invalid email!")
     #hash password, create new object, then insert to db
     User(email, Utils.hash_password(password)).save_to_db()
     return True
Ejemplo n.º 7
0
    def __init__(self, x, y, left, right, direction, speed_x):
        """
        Constructor
        :param x: position x in world
        :param y: position y in world
        :param direction: direction to move, 0 or 1
        :param left, right: limit position for moving of creep
        :return: None
        """
        CreepA.__init__(self, x, y, left, right, direction, speed_x)
        # Coefficients
        self.frame = 0

        self.move_speed_x = speed_x
        self.frame_rate = self.move_speed_x * 0.3
        self.move_speed_y = 1
        self.direction = direction  # TODO Define enum
        if self.direction == 1:
            self.move_speed_x = -self.move_speed_x
        self.x = x
        self.y = y
        self.pos_creep_screen = 0
        self.left = left
        self.right = right

        # Status
        self.down_able = True

        image_source = Utils.my_load_image("creep", "creep1.png")
        self.images_forward = Utils.load_frame(image_source, 803, 215, 41, 55, 12, 4)

        self.images_back = []
        for image in self.images_forward:
            self.images_back.append(pygame.transform.flip(image, 1, 0))

        self.frame_length = len(self.images_forward)

        self.image = self.images_forward[0]

        self.rect = self.image.get_rect()  # Default position at (0,0)
        self.rect.move_ip(self.pos_creep_screen, self.y)

        self.base_line = self.y
Ejemplo n.º 8
0
    def register_user(email, password):
        """
        This method registers a user using e-mail and password.
        The password already comes hashed as sha-512.
        :param email: user's e-mail (might be invalid)
        :param password: sha512-hashed password
        :return: True if registered successfully, or False otherwise (exceptions can also be raised)
        """
        user_data = Database.find_one(UserConstants.COLLECTION, {"email": email})

        if user_data is not None:
            raise UserErrors.UserAlreadyRegisteredError("The e-mail you used to register already exists.")
        if not Utils.email_is_valid(email):
            raise UserErrors.InvalidEmailError("The e-mail does not have the right format.")

        user = User(email, Utils.hash_password(password))
        user.save_to_db()

        return user
Ejemplo n.º 9
0
    def createFolder(self, strFolder):
        try:
            # build URI
            strURIRequest = self.strURIFolder + "/" + strFolder
            signedURI = Utils.Sign(Utils(), strURIRequest)

            responseStream = Utils.processCommand(Utils(), signedURI, "PUT", "", "")

            return responseStream

        except:
            raise "exception"
Ejemplo n.º 10
0
 def login_valid_user(email, password):
     """
     :param  email: user's email
     :param password: user's password
     :return: True if valid, False otherwise
     """
     userData = Database.find_one("users", {'email': email})
     if userData is None:
         raise UserNotExistsError("this user does not existed!")
         return False
     if not Utils.check_hashed_password(password, userData['password']):
         raise UserIncorrectPasswordError("Incorrect password!")
         return False
     return True
Ejemplo n.º 11
0
    def getSpaceInfo(self):
        try:
            # build URI
            strURI = self.strURIDisc

            # sign URI
            signedURI = Utils.Sign(Utils(), strURI)

            responseStream = Utils.processCommand(Utils(), signedURI, "GET", "JSON", "")

            return responseStream

        except:
            raise "exception"
Ejemplo n.º 12
0
    def __init__(self, folder, sprite_name, direction, whichplayer, offset, screen):


        pygame.sprite.Sprite.__init__(self, self.containers)
        self.reloading = 0
        self.frame = 0
        self.thow_frame = 24
        self.facing = direction
        self.direction = direction
        self.sound_change_radar = Utils.load_sound("bite.wav");
        self.sound_change_radar.set_volume(0.3)
        image_source = Utils.my_load_image(folder, sprite_name+".png")
        emotion_source = Utils.my_load_image(folder, sprite_name+"_emotion.png")
        if whichplayer == 1:
            self.image_frame = Utils.cut_frame(image_source, 114, 90, 110, 90)
            self.image_frame.extend(Utils.cut_frame(emotion_source,114,90,110,90))
        else:
            self.image_frame = Utils.cut_frame(image_source, 114, 85, 110, 98)
            self.image_frame.extend(Utils.cut_frame(emotion_source,114,85,110,98))

        if self.direction > 0:
            self.image = self.image_frame[0]
        else:
            self.image = pygame.transform.flip(self.image_frame[0],0,0)


        self.rect = Rect(160, 200, 110, 90)
        self.rect = self.rect.inflate(-30, -30)
        self.pos = [self.rect.left + 19 , self.rect.top + 18]

        self.origtop = self.rect.top
        self.health = 100
        self.angle = 45
        self.power = Constant.MAXPOWER * self.fireF
        self.typeOfBullet = EBulletType.BASIC
        self.moveWithScreen = False
        self.mask = pygame.mask.from_surface(self.image)
        self.whichplayer = whichplayer
        self.enegery = 100
        self.screen = screen
        self.coin = 0
        Live_bar(self, None, 1)
        Energy_bar(self)
        Power_bar(self)
        self.money = 0

        self.sound_money = Utils.load_sound('yahoo.ogg')
Ejemplo n.º 13
0
    def getFolders(self):
        try:
            # build URI
            strURIRequest = self.strURIFolder
            signedURI = Utils.Sign(Utils(), strURIRequest)

            responseStream = Utils.processCommand(Utils(), signedURI, "GET", "JSON", "")

            if responseStream.status_code != 200:
                return False
            else:
                return responseStream

        except:
            raise "exception"
Ejemplo n.º 14
0
    def is_login_valid(cls, email, password):
        """
        This method verifies that an e-mail/password combo (as sent by the site forms) is valid or not.
        Checks that the e-mail exists, and that the password associated to that e-mail is correct.
        :param email: The user's email
        :param password: A sha512 hashed password
        :return: True if valid, False otherwise
        """
        user_data = Database.find_one(UserConstants.COLLECTION, {"email": email})  # Password in sha512 -> pbkdf2_sha512
        if user_data is None:
            # Tell the user that their e-mail doesn't exist
            raise UserErrors.UserNotExistsError("Your user does not exist.")
        if not Utils.check_hashed_password(password, user_data['password']):
            # Tell the user that their password is wrong
            raise UserErrors.IncorrectPasswordError("Your password was wrong.")

        return cls(**user_data)
Ejemplo n.º 15
0
    def FileExists(self, fileName):
        try:
            if fileName == "":
                raise Exception("No file name specified")

                # build URI
            strURI = self.strURIExist + fileName

            # sign URI
            signedURI = Utils.Sign(Utils(), strURI)

            responseStream = Utils.processCommand(Utils(), signedURI, "GET", "JSON", "")

            return responseStream

        except:
            raise "exception"
Ejemplo n.º 16
0
    def DeleteFile(self, fileName):

        try:

            # //check whether file is set or not
            if fileName == "":
                raise Exception("No file name specified")

                # build URI
            strURI = self.strURIFile + fileName

            # sign URI
            signedURI = Utils.Sign(strURI)

            responseStream = json_decode(Utils.processCommand(signedURI, "DELETE", "", ""))
            if responseStream.code != 200:
                return False
            else:
                return True

        except:
            raise "exception"
Ejemplo n.º 17
0
		df_growth_data = self.get_growth_data()
		df_growth_data = df_growth_data.set_index( 'code' )
		
		df_debtpaying_data = self.get_debtpaying_data()
		df_debtpaying_data = df_debtpaying_data.set_index( 'code' )
		
		df_cashflow_data = self.get_cashflow_data()
		df_cashflow_data = df_cashflow_data.set_index( 'code' )
		
		df_divi_data = self.get_divi_data()
		df_divi_data = df_divi_data.set_index( 'code' )
		
		df_forcast_quarter_report_data = self.get_forcast_quarter_report_data()
		df_forcast_quarter_report_data = df_forcast_quarter_report_data.set_index( 'code' )

		df_restrict_stock_data = self.get_restrict_stock_data()
		df_restrict_stock_data = df_restrict_stock_data.set_index( 'code' )
		
		df_concept_classified = self.get_concept_classified_data()
		df_concept_classified = df_concept_classified.set_index( 'code' )

		LOG( 'finish loading.' )

		return [ df_stock_basics, df_quarter_report_data, df_profit_data, df_operation_data, df_growth_data, df_debtpaying_data, \
				df_cashflow_data, df_divi_data, df_forcast_quarter_report_data, df_restrict_stock_data, df_concept_classified ]
						
'''--------------- run ---------------'''			
if __name__ == '__main__':
	
	Data( Utils.cur_date() ).update_all()
Ejemplo n.º 18
0
    def register_user(email, password, nick_name, file=None):
        el = Elasticsearch(port=port)
        """
        This method registers a user using e-mail and password
        The password already comes hashed as sha-512
        :param email: user's email (might be invalid)
        :param password: sha512-hashed password
        :return: True if registered successfully, of False otherwise (exceptions can also be raised)
        """
        try:
            user_data = Database.find_one(UserConstants.COLLECTION,
                                          {"email": email})

            if user_data is not None:
                # Tell user they are already registered
                raise UserErrors.UserAlreadyRegisteredError(
                    "The e-mail you used to register already exists.")

            if not Utils.email_is_valid(email):
                # Tell user that their e-mail is not constructed properly.
                raise UserErrors.InvalidEmailError(
                    "The e-mail does not have the right format.")

            if nick_name == '' or nick_name == None:

                user = User(email,
                            Utils.hash_password(password),
                            nick_name=None,
                            picture=file)
                user.save_to_mongo()
                doc = {
                    'email': email,
                    'nick_name': nick_name,
                    'user_id': user._id,
                }

            else:
                user = User(email,
                            Utils.hash_password(password),
                            nick_name=nick_name,
                            picture=file)
                user.save_to_mongo()

                doc = {
                    'email': email,
                    'nick_name': nick_name,
                    'user_id': user._id,
                }
            el.index(index="users", doc_type='user', body=doc, id=user._id)

            return True

        except TypeError:

            if not Utils.email_is_valid(email):
                # Tell user that their e-mail is not constructed properly.
                raise UserErrors.InvalidEmailError(
                    "The e-mail does not have the right format.")

            user_id = User.find_by_email(email)._id
            if nick_name == '' or nick_name == None:

                User(email,
                     Utils.hash_password(password),
                     nick_name=None,
                     picture=file).save_to_mongo()
                doc = {
                    'email': email,
                    'nick_name': nick_name,
                    'user_id': user_id,
                }

            else:
                User(email,
                     Utils.hash_password(password),
                     nick_name=nick_name,
                     picture=file).save_to_mongo()

                doc = {
                    'email': email,
                    'nick_name': nick_name,
                    'user_id': user_id,
                }
            el.index(index="users", doc_type='user', body=doc, id=user_id)

            return True
Ejemplo n.º 19
0
 def __init__(self):
     self.preprocessing = Preprocessing()
     self.utils = Utils()
class ServiceStatus:
    def __init__(self, repo, net_id):
        self.repo = repo
        self.route = "/encoding"
        self.rex_for_pb_ip = "^(http://)*(https://)*127.0.0.1|^(http://)*(https://)*localhost|^(http://)*(https://)*192.|^(http://)*(https://)*172.|^(http://)*(https://)*10."
        self.obj_util = Utils()
        self.net_id = net_id

    def _get_service_status(self, url, secure=True):
        try:
            if secure:
                channel = grpc.secure_channel(
                    url,
                    grpc.ssl_channel_credentials(
                        root_certificates=certificate))
            else:
                channel = grpc.insecure_channel(url)

            stub = heartb_pb2_grpc.HealthStub(channel)
            response = stub.Check(heartb_pb2.HealthCheckRequest(service=""),
                                  timeout=SRVC_STATUS_GRPC_TIMEOUT)
            if response is not None and response.status == 1:
                logger.info(response.status)
                return 1, "", ""
            return 0, "", ""
        except Exception as e:
            logger.info(f"error in making grpc call::url: {url}, |error: {e}")
            logger.info(f"error : {e.args}")
            return 0, e.args[0].details, e.args[0].debug_error_string

    def _ping_url(self, url):
        search_count = re.subn(self.rex_for_pb_ip, "", url)[1]
        if search_count == 0:
            secure = True
            if url[:4].lower() == "http" and url[:5].lower() != "https":
                secure = False
            url = self.obj_util.remove_http_https_prefix(url=url)
            return self._get_service_status(url=url, secure=secure)
        return 0, "", ""

    def _get_service_endpoint_data(self):
        query = "SELECT row_id, org_id, service_id, endpoint, is_available, failed_status_count FROM service_endpoint WHERE " \
                "next_check_timestamp < UTC_TIMESTAMP AND endpoint not regexp %s AND (org_id,service_id) IN (SELECT org_id, service_id FROM service WHERE service.is_curated=1) ORDER BY last_check_timestamp ASC " \
                "LIMIT %s"
        result = self.repo.execute(query, [self.rex_for_pb_ip, LIMIT])
        if result is None or result == []:
            logger.info("Unable to find services.")
        return result

    def _update_service_status_parameters(self, status, next_check_timestamp,
                                          failed_status_count, row_id):
        update_query = "UPDATE service_endpoint SET is_available = %s, last_check_timestamp = current_timestamp, " \
                       "next_check_timestamp = %s, failed_status_count = %s WHERE row_id = %s "
        response = self.repo.execute(
            update_query,
            [status, next_check_timestamp, failed_status_count, row_id])
        return response

    def _update_service_status_stats(self, org_id, service_id, old_status,
                                     status):
        previous_state = "UP" if (old_status == 1) else "DOWN"
        current_state = "UP" if (status == 1) else "DOWN"

        try:
            insert_query = "insert into service_status_stats " \
                           "(org_id, service_id, previous_state, current_state, row_created, row_updated) " \
                           "values (%s, %s, %s, %s, %s, %s)"
            self.repo.execute(insert_query, [
                org_id, service_id, previous_state, current_state,
                dt.utcnow(),
                dt.utcnow()
            ])
        except Exception as e:
            logger.info(
                f"error in inserting service status stats, |error: {e}")
        return

    def update_service_status(self):
        service_endpoint_data = self._get_service_endpoint_data()
        rows_updated = 0
        for record in service_endpoint_data:
            status, error_details, debug_error_string = self._ping_url(
                record["endpoint"])
            logger.info(f"error_details: {error_details}")
            logger.info(f"debug_error_string: {debug_error_string}")
            old_status = int.from_bytes(record["is_available"], "big")
            failed_status_count = self._calculate_failed_status_count(
                current_status=status,
                old_status=old_status,
                old_failed_status_count=record["failed_status_count"])
            next_check_timestamp = self._calculate_next_check_timestamp(
                failed_status_count=failed_status_count)
            query_data = self._update_service_status_parameters(
                status=status,
                next_check_timestamp=next_check_timestamp,
                failed_status_count=failed_status_count,
                row_id=record["row_id"])
            if old_status != status:
                self._update_service_status_stats(record["org_id"],
                                                  record["service_id"],
                                                  old_status, status)

            if status == 0:
                org_id = record["org_id"]
                service_id = record["service_id"]
                recipients = self._get_service_provider_email(
                    org_id=org_id, service_id=service_id)
                self._send_notification(org_id=org_id,
                                        service_id=service_id,
                                        recipients=recipients,
                                        endpoint=record["endpoint"],
                                        error_details=error_details,
                                        debug_error_string=debug_error_string)
            rows_updated = rows_updated + query_data[0]
        logger.info(f"no of rows updated: {rows_updated}")

    def _calculate_failed_status_count(self, current_status, old_status,
                                       old_failed_status_count):
        if current_status == old_status == 0:
            return old_failed_status_count + 1
        return 1

    def _calculate_next_check_timestamp(self, failed_status_count):
        time_delta_in_hours = MINIMUM_INTERVAL_IN_HOUR * (2**(
            failed_status_count - 1))
        if time_delta_in_hours > MAXIMUM_INTERVAL_IN_HOUR:
            time_delta_in_hours = MAXIMUM_INTERVAL_IN_HOUR
        next_check_timestamp = dt.utcnow() + timedelta(
            hours=time_delta_in_hours)
        return next_check_timestamp

    def _valid_email(self, email):
        regex = '^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$'
        if re.search(regex, email):
            return True
        return False

    def _send_notification(self, org_id, service_id, recipients, endpoint,
                           error_details, debug_error_string):
        slack_message = self._get_slack_message(
            org_id=org_id,
            service_id=service_id,
            endpoint=endpoint,
            recipients=recipients,
            error_details=error_details,
            debug_error_string=debug_error_string)
        util.report_slack(slack_msg=slack_message, SLACK_HOOK=SLACK_HOOK)
        for recipient in recipients:
            if recipient is None:
                logger.info(
                    f"Email Id is not present for Org Id: {org_id} and Service Id: {service_id}"
                )
            else:
                if self._valid_email(email=recipient):
                    self._send_email_notification(org_id=org_id,
                                                  service_id=service_id,
                                                  recipient=recipient,
                                                  endpoint=endpoint)
                else:
                    logger.info(f"Invalid email_id: {recipient}")

    def _get_slack_message(self, org_id, service_id, endpoint, recipients,
                           error_details, debug_error_string):
        slack_message = f"```Alert!\n\nService {service_id} under organization {org_id} is down for {NETWORK_NAME} " \
                        f"network.\nEndpoint: {endpoint}\nError Details: {error_details}\nDebug Error String: " \
                        f"{debug_error_string}\nContributors: {recipients}  \n\nFor any queries please email at " \
                        f"[email protected]. \n\nWarmest regards, \nSingularityNET Marketplace Team```"
        return slack_message

    def _send_email_notification(self, org_id, service_id, recipient,
                                 endpoint):
        RESET_SERVICE_HEALTH_URL = f"{BASE_URL_TO_RESET_SERVICE_HEALTH}/org/{org_id}/service/{service_id}/health/reset"
        send_notification_payload = {
            "body":
            json.dumps({
                "message":
                f"<html><head></head><body><div><p>Hello,</p><p>Your service {service_id} under organization "
                f"{org_id} is down.</p><p>Please click the below URL to update service status on priority. "
                f"<br/> <a href='{RESET_SERVICE_HEALTH_URL}'>{RESET_SERVICE_HEALTH_URL}</a></p><br /><p><em>"
                f"Please do not reply to the email for any enquiries for any queries please email at "
                f"[email protected]. </em></p><p>Warmest regards, <br /> SingularityNET "
                f"Marketplace Team</p></div></body></html>",
                "subject":
                f"Your service {service_id} is down for {NETWORK_NAME} network.",
                "notification_type":
                "support",
                "recipient":
                recipient
            })
        }
        boto_util.invoke_lambda(lambda_function_arn=NOTIFICATION_ARN,
                                invocation_type="RequestResponse",
                                payload=json.dumps(send_notification_payload))

    def _get_service_provider_email(self, org_id, service_id=None):
        emails = []
        query_response = self.repo.execute(
            "SELECT contributors FROM service_metadata WHERE org_id = %s AND "
            "service_id = %s", [org_id, service_id])
        if len(query_response) == 0:
            logger.info(f"Org Id {org_id} is not present.")
            return None
        contacts = json.loads(query_response[0].get("contributors", '[]'))
        for contact in contacts:
            email_id = contact.get("email_id", None)
            if email_id is not None:
                emails.append(email_id)
        return emails
Ejemplo n.º 21
0
class Registry:
    def __init__(self, obj_repo):
        self.repo = obj_repo
        self.obj_utils = Utils()

    def service_build_status_notifier(self, org_id, service_id, build_status):
        logger.info(
            f"received event for service_id: {service_id} org_id:{org_id}")
        if build_status == BUILD_CODE['FAILED']:
            self.curate_service(org_id, service_id, curated=False)
        elif build_status == BUILD_CODE['SUCCESS']:
            self.curate_service(org_id, service_id, curated=True)
        else:
            raise Exception("invalid build status")

    def _get_all_service(self):
        """ Method to generate org_id and service mapping."""
        try:
            all_orgs_srvcs_raw = self.repo.execute(
                "SELECT O.org_id, O.organization_name,O.org_assets_url, O.owner_address, S.service_id  FROM service S, "
                "organization O WHERE S.org_id = O.org_id AND S.is_curated = 1"
            )
            all_orgs_srvcs = {}
            for rec in all_orgs_srvcs_raw:
                if rec['org_id'] not in all_orgs_srvcs.keys():
                    all_orgs_srvcs[rec['org_id']] = {
                        'service_id': [],
                        'organization_name': rec["organization_name"],
                        'owner_address': rec['owner_address']
                    }
                all_orgs_srvcs[rec['org_id']]['service_id'].append(
                    rec['service_id'])
            return all_orgs_srvcs
        except Exception as e:
            print(repr(e))
            raise e

    def _get_all_members(self, org_id=None):
        """ Method to generate org_id and members mapping."""
        try:
            query = "SELECT org_id, `member` FROM members M"
            params = None
            if org_id is not None:
                query += " where M.org_id = %s"
                params = [org_id]

            all_orgs_members_raw = self.repo.execute(query, params)
            all_orgs_members = defaultdict(list)
            for rec in all_orgs_members_raw:
                all_orgs_members[rec['org_id']].append(rec['member'])
            return all_orgs_members
        except Exception as e:
            print(repr(e))
            raise e

    def get_all_org(self):
        """ Method to get list and high level details of all organization."""
        try:
            all_orgs_srvcs = self._get_all_service()
            all_orgs_members = self._get_all_members()
            all_orgs_data = []
            for org_rec in all_orgs_srvcs:
                data = {
                    "org_id": org_rec,
                    "org_name": all_orgs_srvcs[org_rec]["organization_name"],
                    "owner_address": all_orgs_srvcs[org_rec]['owner_address'],
                    "service_id": all_orgs_srvcs[org_rec]['service_id'],
                    "members": all_orgs_members.get(org_rec, [])
                }
                all_orgs_data.append(data)
            return all_orgs_data
        except Exception as e:
            print(repr(e))
            raise e

    def _prepare_subquery(self, s, q, fm):
        try:
            sub_qry = ""
            if s == "all":
                for rec in fm:
                    sub_qry += fm[rec] + " LIKE '%" + str(q) + "%' OR "
                sub_qry = sub_qry[:-3] if sub_qry.endswith("OR ") else sub_qry
            else:
                sub_qry += fm[s] + " LIKE '%" + str(q) + "%' "
            return sub_qry.replace("org_id", "M.org_id")
        except Exception as err:
            raise err

    def _get_total_count(self, sub_qry, filter_query, values):
        try:
            if filter_query != "":
                filter_query = " AND " + filter_query
            search_count_query = "SELECT count(*) as search_count FROM service A, (SELECT DISTINCT M.org_id, M.service_id FROM " \
                                 "service_metadata M LEFT JOIN service_tags T ON M.service_row_id = T.service_row_id WHERE (" \
                                 + sub_qry.replace('%',
                                                   '%%') + ")" + filter_query + ") B WHERE A.service_id = B.service_id " \
                                                                                "AND A.org_id = B.org_id AND A.is_curated = 1 "

            res = self.repo.execute(search_count_query, values)
            return res[0].get("search_count", 0)
        except Exception as err:
            raise err

    def _convert_service_metadata_str_to_json(self, record):
        record["service_rating"] = json.loads(record["service_rating"])
        record["org_assets_url"] = json.loads(record["org_assets_url"])
        record["contributors"] = json.loads(record.get("contributors", "[]"))
        record["contacts"] = json.loads(record.get("contacts", "[]"))

        if record["contacts"] is None:
            record["contacts"] = []
        if record["contributors"] is None:
            record["contributors"] = []

    def _search_query_data(self, sub_qry, sort_by, order_by, offset, limit,
                           filter_query, values):
        try:
            if filter_query != "":
                filter_query = " AND " + filter_query
            srch_qry = "SELECT * FROM service A, (SELECT M.org_id, M.service_id, group_concat(T.tag_name) AS tags FROM " \
                       "service_metadata M LEFT JOIN service_tags T ON M.service_row_id = T.service_row_id " \
                       "LEFT JOIN service_endpoint E ON M.service_row_id = E.service_row_id WHERE (" \
                       + sub_qry.replace('%', '%%') + ")" + filter_query + \
                       " GROUP BY M.org_id, M.service_id ORDER BY E.is_available DESC, " + sort_by + " " + order_by + \
                       " ) B WHERE A.service_id = B.service_id AND A.org_id=B.org_id AND A.is_curated= 1 LIMIT %s , %s"

            qry_dta = self.repo.execute(srch_qry, values +
                                        [int(offset), int(limit)])
            org_srvc_tuple = ()
            rslt = {}
            for rec in qry_dta:
                org_id = rec['org_id']
                service_id = rec['service_id']
                tags = rec['tags']
                org_srvc_tuple = org_srvc_tuple + ((org_id, service_id), )
                if org_id not in rslt.keys():
                    rslt[org_id] = {}
                if service_id not in rslt[org_id].keys():
                    rslt[org_id][service_id] = {}
                rslt[org_id][service_id]["tags"] = tags
            qry_part = " AND (S.org_id, S.service_id) IN " + \
                       str(org_srvc_tuple).replace(',)', ')')
            qry_part_where = " AND (org_id, service_id) IN " + \
                       str(org_srvc_tuple).replace(',)', ')')
            print("qry_part::", qry_part)
            sort_by = sort_by.replace("org_id", "M.org_id")
            if org_srvc_tuple:
                services = self.repo.execute(
                    "SELECT DISTINCT M.row_id, M.service_row_id, M.org_id, M.service_id, M.display_name, M.description, M.url, M.json, M.model_ipfs_hash, M.encoding, M.`type`,"
                    " M.mpe_address,M.service_rating, M.ranking, M.contributors, M.short_description,"
                    "O.organization_name,O.org_assets_url FROM service_endpoint E, service_metadata M, service S "
                    ", organization O WHERE O.org_id = S.org_id AND S.row_id = M.service_row_id AND "
                    "S.row_id = E.service_row_id " + qry_part +
                    "ORDER BY E.is_available DESC, " + sort_by + " " +
                    order_by)
                services_media = self.repo.execute(
                    "select org_id ,service_id,file_type ,asset_type,url,alt_text ,`order`,row_id from service_media where asset_type = 'hero_image' "
                    + qry_part_where)
            else:
                services = []
                services_media = []
            obj_utils = Utils()
            obj_utils.clean(services)
            available_service = self._get_is_available_service()
            for rec in services:
                self._convert_service_metadata_str_to_json(rec)

                org_id = rec["org_id"]
                service_id = rec["service_id"]
                tags = []
                is_available = 0
                if rslt.get(org_id, {}).get(service_id,
                                            {}).get("tags", None) is not None:
                    tags = rslt[org_id][service_id]["tags"].split(",")
                if (org_id, service_id) in available_service:
                    is_available = 1
                asset_media = []
                if len(services_media) > 0:
                    asset_media = [
                        x for x in services_media
                        if x['service_id'] == service_id
                    ]
                    if len(asset_media) > 0:
                        asset_media = asset_media[0]
                rec.update({"tags": tags})
                rec.update({"is_available": is_available})
                rec.update({"media": asset_media})

            return services
        except Exception as err:
            raise err

    def _search_response_format(self, tc, offset, limit, rslt):
        try:
            return {
                "total_count": tc,
                "offset": offset,
                "limit": limit,
                "result": rslt
            }
        except Exception as err:
            raise err

    def get_all_srvcs(self, qry_param):
        try:
            fields_mapping = {
                "display_name": "display_name",
                "tag_name": "tag_name",
                "org_id": "org_id"
            }
            s = qry_param.get('s', 'all')
            q = qry_param.get('q', '')
            offset = qry_param.get('offset', GET_ALL_SERVICE_OFFSET_LIMIT)
            limit = qry_param.get('limit', GET_ALL_SERVICE_LIMIT)
            sort_by = fields_mapping.get(qry_param.get('sort_by', None),
                                         "ranking")
            order_by = qry_param.get('order_by', 'desc')
            if order_by.lower() != "desc":
                order_by = "asc"

            sub_qry = self._prepare_subquery(s=s, q=q, fm=fields_mapping)
            print("get_all_srvcs::sub_qry: ", sub_qry)

            filter_qry = ""
            if qry_param.get("filters", None) is not None:
                filter_query, values = self._filters_to_query(
                    qry_param.get("filters"))
                print("get_all_srvcs::filter_query: ", filter_query,
                      "|values: ", values)
            total_count = self._get_total_count(sub_qry=sub_qry,
                                                filter_query=filter_query,
                                                values=values)
            if total_count == 0:
                return self._search_response_format(total_count, offset, limit,
                                                    [])
            q_dta = self._search_query_data(sub_qry=sub_qry,
                                            sort_by=sort_by,
                                            order_by=order_by,
                                            offset=offset,
                                            limit=limit,
                                            filter_query=filter_query,
                                            values=values)
            return self._search_response_format(total_count, offset, limit,
                                                q_dta)
        except Exception as e:
            print(repr(e))
            raise e

    def get_group_info(self, org_id, service_id):
        try:
            group_data = self.repo.execute(
                "SELECT G.*, E.* FROM service_group G INNER JOIN service_endpoint E ON G.group_id = E.group_id AND G.service_row_id = E.service_row_id WHERE "
                "G.org_id = %s AND G.service_id = %s ", [org_id, service_id])
            self.obj_utils.clean(group_data)
            groups = {}
            for rec in group_data:
                group_id = rec['group_id']
                if group_id not in groups.keys():
                    groups = {
                        group_id: {
                            "group_id":
                            rec['group_id'],
                            "group_name":
                            rec['group_name'],
                            "pricing":
                            json.loads(rec['pricing']),
                            "endpoints": [],
                            "free_calls":
                            rec.get("free_calls", 0),
                            "free_call_signer_address":
                            rec.get("free_call_signer_address", "")
                        }
                    }
                groups[group_id]['endpoints'].append({
                    "endpoint":
                    rec['endpoint'],
                    "is_available":
                    rec['is_available'],
                    "last_check_timestamp":
                    rec["last_check_timestamp"]
                })
            return list(groups.values())
        except Exception as e:
            print(repr(e))
            raise e

    def get_service_media(self, org_id, service_id):
        try:
            query = """select `row_id`,url,`order`,file_type,asset_type,alt_text from service_media 
            where service_id = %s and org_id = %s """
            query_response = self.repo.execute(query, [service_id, org_id])
            media = []
            if len(query_response) == 0:
                return []
            for response_item in query_response:
                media.append({
                    "row_id": response_item['row_id'],
                    "url": response_item['url'],
                    "file_type": response_item['file_type'],
                    "order": response_item['order'],
                    "alt_text": response_item['alt_text']
                })
            return media
        except Exception as e:
            raise e

    def _get_is_available_service(self):
        try:
            available_service = []
            srvc_st_dta = self.repo.execute(
                "SELECT DISTINCT org_id, service_id  FROM service_endpoint WHERE is_available = 1"
            )
            for rec in srvc_st_dta:
                available_service.append((rec['org_id'], rec['service_id']), )
            return available_service
        except Exception as err:
            print(repr(err))
            raise err

    def _filter_condition_to_query(self, filter_condition):
        value = []
        if filter_condition.attr in ["org_id", "service_id"]:
            filter_condition.attr = "M." + filter_condition.attr
        if filter_condition.operator == "=":
            value = filter_condition.value
            return '%s %s"%s"' % (filter_condition.attr,
                                  filter_condition.operator, "%s"), value
        if filter_condition.operator == "IN":
            value = filter_condition.value
            return '%s %s %s' % (filter_condition.attr,
                                 filter_condition.operator, "(" +
                                 (("%s,") * len(value))[:-1] + ")"), value
        if filter_condition.operator == "BETWEEN":
            value = filter_condition.value
            return '%s %s %s AND %s' % (filter_condition.attr,
                                        filter_condition.operator, "%s",
                                        "%s"), value

    def _filters_to_query(self, filter_json):
        query = ""
        filters = []
        values = []
        for filter in filter_json:
            filters.append(Filter(filter))
        for filter in filters:
            query += "("
            for filter_condition in filter.get_filter().get("filter"):
                sub_query, value = self._filter_condition_to_query(
                    filter_condition)
                values += value
                query = query + "(" + sub_query + ") AND "
            if query.endswith(" AND "):
                query = query[:-5]
            query += ") OR "
        if query.endswith(" OR "):
            query = query[:-4]
        return query, values

    def get_filter_attribute(self, attribute):
        """ Method to fetch filter metadata based on attribute."""
        try:
            filter_attribute = {"attribute": attribute, "values": []}
            if attribute == "tag_name":
                filter_data = self.repo.execute(
                    "SELECT DISTINCT tag_name AS 'key', tag_name AS 'value' FROM service_tags T, service S "
                    "WHERE S.row_id = T.service_row_id AND S.is_curated = 1")
            elif attribute == "display_name":
                filter_data = self.repo.execute(
                    "SELECT DISTINCT S.service_id AS 'key',display_name AS 'value' FROM service_metadata M, service S "
                    "WHERE S.row_id = M.service_row_id AND S.is_curated = 1")
            elif attribute == "org_id":
                filter_data = self.repo.execute(
                    "SELECT DISTINCT O.org_id AS 'key' ,O.organization_name AS 'value' from organization O, service S "
                    "WHERE S.org_id = O.org_id AND S.is_curated = 1")
            else:
                return filter_attribute
            for rec in filter_data:
                filter_attribute["values"].append(rec)

            return filter_attribute
        except Exception as e:
            print(repr(e))
            raise e

    def get_all_group_for_org_id(self, org_id):
        """ Method to get all group data for given org_id. This includes group data at org level"""
        try:
            groups_data = self.repo.execute(
                "SELECT group_id, group_name, payment FROM org_group WHERE org_id = %s",
                [org_id])
            [
                group_record.update(
                    {'payment': json.loads(group_record['payment'])})
                for group_record in groups_data
            ]
            groups = {"org_id": org_id, "groups": groups_data}
            return groups
        except Exception as e:
            print(repr(e))
            raise e

    def get_group_details_for_org_id(self, org_id, group_id):
        """ Method to get group data for given org_id and group_id. This includes group data at org level"""
        group_data = self.repo.execute(
            "SELECT group_id, group_name, payment , org_id FROM org_group WHERE org_id = %s and group_id = %s",
            [org_id, group_id])
        [
            group_record.update(
                {'payment': json.loads(group_record['payment'])})
            for group_record in group_data
        ]
        return {"groups": group_data}

    def get_service_data_by_org_id_and_service_id(self, org_id, service_id):
        try:
            """ Method to get all service data for given org_id and service_id"""
            tags = []
            org_groups_dict = {}
            basic_service_data = self.repo.execute(
                "SELECT M.row_id, M.service_row_id, M.org_id, M.service_id, M.display_name, M.description, M.url, M.json, M.model_ipfs_hash, M.encoding, M.`type`,"
                " M.mpe_address,M.service_rating, M.ranking, M.contributors, M.short_description,"
                " S.*, O.org_id, O.organization_name, O.owner_address, O.org_metadata_uri, O.org_email, "
                "O.org_assets_url, O.description as org_description, O.contacts "
                "FROM service_metadata M, service S, organization O "
                "WHERE O.org_id = S.org_id AND S.row_id = M.service_row_id AND S.org_id = %s "
                "AND S.service_id = %s AND S.is_curated = 1",
                [org_id, service_id])
            if len(basic_service_data) == 0:
                return []
            self.obj_utils.clean(basic_service_data)

            org_group_data = self.repo.execute(
                "SELECT * FROM org_group WHERE org_id = %s", [org_id])
            self.obj_utils.clean(org_group_data)

            service_group_data = self.get_group_info(org_id=org_id,
                                                     service_id=service_id)

            tags = self.repo.execute(
                "SELECT tag_name FROM service_tags WHERE org_id = %s AND service_id = %s",
                [org_id, service_id])

            media = self.get_service_media(org_id=org_id,
                                           service_id=service_id)
            result = basic_service_data[0]

            self._convert_service_metadata_str_to_json(result)

            for rec in org_group_data:
                org_groups_dict[rec['group_id']] = {
                    "payment": json.loads(rec["payment"])
                }

            is_available = 0
            # Hard Coded Free calls in group data
            for rec in service_group_data:
                rec["free_calls"] = rec.get("free_calls", 0)
                if is_available == 0:
                    endpoints = rec['endpoints']
                    for endpoint in endpoints:
                        is_available = endpoint['is_available']
                        if is_available == 1:
                            break
                rec.update(org_groups_dict.get(rec['group_id'], {}))

            result.update({
                "is_available": is_available,
                "groups": service_group_data,
                "tags": tags,
                "media": media
            })
            return result
        except Exception as e:
            print(repr(e))
            raise e

    def get_org_details(self, org_id):
        """ Method to get org details for given org_id. """
        try:
            org_details = self.repo.execute(
                "SELECT * from organization o, (select org_id, count(*) as service_count "
                "from service where org_id = %s) s where o.org_id = %s and o.org_id = s.org_id",
                [org_id, org_id])

            obj_utils = Utils()
            obj_utils.clean(org_details)
            if len(org_details) > 0:
                members = self._get_all_members(org_id)
                org_details[0]["members"] = members
            return org_details
        except Exception as e:
            print(repr(e))
            raise e

    def update_service_rating(self, org_id, service_id):
        """
            Method updates service_rating and total_user_rated when user rating is changed for given service_id
            and org_id.
        """
        try:
            update_service_metadata = self.repo.execute(
                "UPDATE service_metadata A  INNER JOIN "
                "(SELECT U.org_id, U.service_id, AVG(U.rating) AS service_rating, count(*) AS total_users_rated "
                "FROM user_service_vote AS U WHERE U.rating IS NOT NULL GROUP BY U.service_id, U.org_id ) AS B "
                "ON A.org_id=B.org_id AND A.service_id=B.service_id SET A.service_rating "
                "= CONCAT('{\"rating\":', B.service_rating, ' , \"total_users_rated\":', B.total_users_rated, '}') "
                "WHERE A.org_id = %s AND A.service_id = %s ",
                [org_id, service_id])
            return "success"
        except Exception as e:
            print(repr(e))
            raise e

    def curate_service(self, org_id, service_id, curated):
        service_repo = ServiceRepository(self.repo)
        if str(curated).lower() == "true":
            service_repo.curate_service(org_id, service_id, 1)
        elif str(curated).lower() == "false":
            service_repo.curate_service(org_id, service_id, 0)
        else:
            Exception("Invalid curation flag")

    def get_service_media(self, org_id, service_id):
        try:
            query = """select `row_id`,url,`order`,file_type,asset_type,alt_text from service_media 
            where service_id = %s and org_id = %s """
            query_response = self.repo.execute(query, [service_id, org_id])
            media = []
            if len(query_response) == 0:
                return media
            for response_item in query_response:
                media.append({
                    "row_id": response_item['row_id'],
                    "url": response_item['url'],
                    "file_type": response_item['file_type'],
                    "order": response_item['order'],
                    "alt_text": response_item['alt_text'],
                    "asset_type": response_item['asset_type']
                })
            return media
        except Exception as e:
            logger.error(
                f'Error in getting service media data for org_id = {org_id} service_id = {service_id}'
            )
            raise e
Ejemplo n.º 22
0
    def _search_query_data(self, sub_qry, sort_by, order_by, offset, limit,
                           filter_query, values):
        try:
            if filter_query != "":
                filter_query = " AND " + filter_query
            srch_qry = "SELECT * FROM service A, (SELECT M.org_id, M.service_id, group_concat(T.tag_name) AS tags FROM " \
                       "service_metadata M LEFT JOIN service_tags T ON M.service_row_id = T.service_row_id " \
                       "LEFT JOIN service_endpoint E ON M.service_row_id = E.service_row_id WHERE (" \
                       + sub_qry.replace('%', '%%') + ")" + filter_query + \
                       " GROUP BY M.org_id, M.service_id ORDER BY E.is_available DESC, " + sort_by + " " + order_by + \
                       " ) B WHERE A.service_id = B.service_id AND A.org_id=B.org_id AND A.is_curated= 1 LIMIT %s , %s"

            qry_dta = self.repo.execute(srch_qry, values +
                                        [int(offset), int(limit)])
            org_srvc_tuple = ()
            rslt = {}
            for rec in qry_dta:
                org_id = rec['org_id']
                service_id = rec['service_id']
                tags = rec['tags']
                org_srvc_tuple = org_srvc_tuple + ((org_id, service_id), )
                if org_id not in rslt.keys():
                    rslt[org_id] = {}
                if service_id not in rslt[org_id].keys():
                    rslt[org_id][service_id] = {}
                rslt[org_id][service_id]["tags"] = tags
            qry_part = " AND (S.org_id, S.service_id) IN " + \
                       str(org_srvc_tuple).replace(',)', ')')
            qry_part_where = " AND (org_id, service_id) IN " + \
                       str(org_srvc_tuple).replace(',)', ')')
            print("qry_part::", qry_part)
            sort_by = sort_by.replace("org_id", "M.org_id")
            if org_srvc_tuple:
                services = self.repo.execute(
                    "SELECT DISTINCT M.row_id, M.service_row_id, M.org_id, M.service_id, M.display_name, M.description, M.url, M.json, M.model_ipfs_hash, M.encoding, M.`type`,"
                    " M.mpe_address,M.service_rating, M.ranking, M.contributors, M.short_description,"
                    "O.organization_name,O.org_assets_url FROM service_endpoint E, service_metadata M, service S "
                    ", organization O WHERE O.org_id = S.org_id AND S.row_id = M.service_row_id AND "
                    "S.row_id = E.service_row_id " + qry_part +
                    "ORDER BY E.is_available DESC, " + sort_by + " " +
                    order_by)
                services_media = self.repo.execute(
                    "select org_id ,service_id,file_type ,asset_type,url,alt_text ,`order`,row_id from service_media where asset_type = 'hero_image' "
                    + qry_part_where)
            else:
                services = []
                services_media = []
            obj_utils = Utils()
            obj_utils.clean(services)
            available_service = self._get_is_available_service()
            for rec in services:
                self._convert_service_metadata_str_to_json(rec)

                org_id = rec["org_id"]
                service_id = rec["service_id"]
                tags = []
                is_available = 0
                if rslt.get(org_id, {}).get(service_id,
                                            {}).get("tags", None) is not None:
                    tags = rslt[org_id][service_id]["tags"].split(",")
                if (org_id, service_id) in available_service:
                    is_available = 1
                asset_media = []
                if len(services_media) > 0:
                    asset_media = [
                        x for x in services_media
                        if x['service_id'] == service_id
                    ]
                    if len(asset_media) > 0:
                        asset_media = asset_media[0]
                rec.update({"tags": tags})
                rec.update({"is_available": is_available})
                rec.update({"media": asset_media})

            return services
        except Exception as err:
            raise err
Ejemplo n.º 23
0
class Signer:
    def __init__(self, obj_repo, net_id):
        self.repo = obj_repo
        self.net_id = net_id
        self.lambda_client = boto3.client('lambda')
        self.obj_utils = Utils()

    def _free_calls_allowed(self, username, org_id, service_id):
        """
            Method to check free calls exists for given user or not.
            Call monitoring service to get the details
        """
        try:
            lambda_payload = {"httpMethod": "GET",
                              "queryStringParameters": {"organization_id": org_id, "service_id": service_id,
                                                            "username": username}}


            response = self.lambda_client.invoke(FunctionName=GET_FREE_CALLS_METERING_ARN, InvocationType='RequestResponse',
                                                 Payload=json.dumps(lambda_payload))
            response_body_raw = json.loads(
                response.get('Payload').read())['body']
            response_body = json.loads(response_body_raw)
            free_calls_allowed = response_body["free_calls_allowed"]
            total_calls_made = response_body["total_calls_made"]
            is_free_calls_allowed = True if (
                (free_calls_allowed - total_calls_made) > 0) else False
            return is_free_calls_allowed
        except Exception as e:
            print(repr(e))
            raise e

    def signature_for_free_call(self, user_data, org_id, service_id):
        """
            Method to generate signature for free call.
        """
        try:
            username = user_data['authorizer']['claims']['email']
            if self._free_calls_allowed(username=username, org_id=org_id, service_id=service_id):
                current_block_no = self.obj_utils.get_current_block_no(
                    ws_provider=NETWORKS[self.net_id]['ws_provider'])
                provider = Web3.HTTPProvider(
                    NETWORKS[self.net_id]['http_provider'])
                w3 = Web3(provider)
                message = web3.Web3.soliditySha3(["string", "string", "string", "string", "uint256"],
                                                 [PREFIX_FREE_CALL, username, org_id, service_id, current_block_no])
                if not config['private_key'].startswith("0x"):
                    config['private_key'] = "0x" + config['private_key']
                signature = bytes(w3.eth.account.signHash(
                    defunct_hash_message(message), config['private_key']).signature)
                signature = signature.hex()
                if not signature.startswith("0x"):
                    signature = "0x" + signature
                return {"snet-free-call-user-id": username, "snet-payment-channel-signature-bin": signature,
                        "snet-current-block-number": current_block_no, "snet-payment-type": "free-call"}
            else:
                raise Exception(
                    "Free calls expired for username %s.", username)
        except Exception as e:
            print(repr(e))
            raise e

    def _get_user_address(self, username):
        try:
            wallet_address_data = self.repo.execute("SELECT address FROM wallet WHERE username = %s AND status = 1 "
                                                    "LIMIT 1", [username])
            if len(wallet_address_data) == 1:
                return wallet_address_data[0]['address']
            raise Exception(
                "Unable to find wallet address for username %s", username)
        except Exception as e:
            print(repr(e))
            raise e

    def _get_service_metadata(self, org_id, service_id):
        """
            Method to get group details for given org_id and service_id.
        """
        try:
            result = self.repo.execute(
                "SELECT O.*, G.* FROM org_group O, service_group G WHERE O.org_id = G.org_id AND G.group_id = "
                "O.group_id AND G.service_id = %s AND G.org_id = %s AND G.service_row_id IN (SELECT row_id FROM service "
                "WHERE is_curated = 1 ) LIMIT 1", [org_id, service_id])
            if len(result) == 1:
                metadata = result[0]
                payment = json.loads(metadata["payment"])
                pricing = json.loads(metadata["pricing"])
                metadata.update(payment)
                metadata["pricing"] = pricing
                return metadata
            else:
                raise Exception(
                    "Unable to find service for service_id %s", service_id)
        except Exception as e:
            print(repr(e))
            raise e

    def _get_channel_id(self, sender_address, recipient_address, group_id, signer_address):
        """
            Method to fetch channel id from mpe_channel(RDS).
        """
        try:
            channel_data = self.repo.execute(
                "SELECT channel_id FROM mpe_channel WHERE sender = %s AND recipient = %s AND "
                " groupId = %s AND signer = %s LIMIT 1", [sender_address, recipient_address,
                                                          group_id, signer_address])
            if len(channel_data) == 1:
                return channel_data[0]["channel_id"]
            raise Exception("Unable to find channels.")
        except Exception as e:
            print(repr(e))
            raise e

    def signature_for_regular_call(self, user_data, org_id, service_id):
        """
            Method to generate signature for regular call.
        """
        try:
            username = user_data['authorizer']['claims']['email']
            user_address = self._get_user_address(username=username)
            metadata = self._get_service_metadata(
                org_id=org_id, service_id=service_id)
            recipient_address = metadata['payment']['payment_address']
            channel_id = self._get_channel_id(sender_address=user_address, recipient_address=recipient_address,
                                              group_id=metadata['group_id'], signer_address=config["signer_address"])
            object_service_client = ServiceClient(
                config=config, metadata=metadata, options=dict())
            return object_service_client.get_service_call_metadata(channel_id=channel_id)
        except Exception as e:
            print(repr(e))
            raise Exception(
                "Unable to sign regular call for username %s", username)
Ejemplo n.º 24
0
class User:
    def __init__(self, obj_repo):
        self.repo = obj_repo
        self.obj_utils = Utils()
        self.ssm_client = boto3.client('ssm', region_name="us-east-1")

    def _set_user_data(self, user_data):
        """ Method to set user information. """
        try:
            claims = user_data['authorizer']['claims']
            email_verified = claims['email_verified']
            status = 0
            if email_verified:
                status = 1
            else:
                raise Exception("Email verification is pending.")
            q_dta = [
                claims['email'], user_data['accountId'], claims['nickname'],
                claims['email'], status, status, user_data['requestId'],
                user_data['requestTimeEpoch'],
                dt.utcnow(),
                dt.utcnow()
            ]
            set_usr_dta = self.repo.execute(
                "INSERT INTO user (username, account_id, name, email, email_verified, status, request_id, "
                "request_time_epoch, row_created, row_updated) "
                "VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", q_dta)
            if len(set_usr_dta) > 0:
                return "success"
            else:
                return "User already exist"
        except Exception as e:
            print(repr(e))
            raise e

    def get_wallet_details(self, user_data):
        """ Method to get wallet details for a given username. """
        try:
            username = user_data['authorizer']['claims']['email']
            search_data = self.repo.execute(
                "SELECT * FROM wallet WHERE username = %s", username)
            self.obj_utils.clean(search_data)
            return search_data
        except Exception as e:
            print(repr(e))
            raise e

    # def _link_wallet(self, username):
    #    """ Method to assign wallet address to a user. """
    #    try:
    #        return self.repo.execute("UPDATE wallet SET username = %s WHERE username IS NULL AND status = 1 LIMIT 1", username)
    #    except Exception as e:
    #        print(repr(e))
    #        raise e

    def _fetch_private_key_from_ssm(self, address):
        try:
            store = self.ssm_client.get_parameter(Name=PATH_PREFIX +
                                                  str(address),
                                                  WithDecryption=True)
            return store['Parameter']['Value']
        except Exception as e:
            print(repr(e))
            raise Exception("Error fetching value from parameter store.")

    def user_signup(self, user_data):
        """ Method to assign pre-seeded wallet to user.
            This is one time process.
        """
        try:
            username = user_data['authorizer']['claims']['email']
            set_user_data = self._set_user_data(user_data)
            print(set_user_data)
            return set_user_data
        except Exception as e:
            self.repo.rollback_transaction()
            print(repr(e))
            raise e

    def del_user_data(self, user_data):
        """ Method to delete user data and wallet address.
            Deregister User.
        """
        try:
            username = user_data['authorizer']['claims']['email']
            self.repo.begin_transaction()
            del_user = self.repo.execute(
                "DELETE FROM user WHERE username = %s ", [username])
            updt_wallet = self.repo.execute(
                "UPDATE wallet SET status=0, username=NULL WHERE username = %s ",
                [username])
            self.repo.commit_transaction()
            return []
        except Exception as e:
            self.repo.rollback_transaction()
            print(repr(e))
            raise e

    def get_user_profile(self, user_data):
        '''
            Method to fetch user profile data.
        '''
        try:
            username = user_data['authorizer']['claims']['email']
            result = self.repo.execute(
                "SELECT * FROM user WHERE username = %s", [username])
            self.obj_utils.clean(result)
            return {"success": "success", "data": result}
        except Exception as e:
            print(repr(e))
            raise e

    def update_user_profile(self, email_alerts, is_terms_accepted, user_data):
        '''
            Method to update user profile data.
        '''
        try:
            username = user_data['authorizer']['claims']['email']
            result = self.repo.execute(
                "UPDATE user SET email_alerts = %s, is_terms_accepted = %s WHERE username = %s",
                [
                    int(email_alerts == True),
                    int(is_terms_accepted == True), username
                ])
            return {"success": "success", "data": []}
        except Exception as e:
            print(repr(e))
            raise e

    def validate_and_set_user_feedback(self, feedback_data, user_data):
        """
            Method to validate and set user feedback data.
        """
        schema = Schema([{
            'org_id': And(str),
            'service_id': And(str),
            'user_rating': And(str),
            'comment': And(str)
        }])
        try:
            feedback_data = schema.validate([feedback_data])
            feedback_recorded = self._set_user_feedback(feedback_data[0],
                                                        user_data=user_data)
            if feedback_recorded:
                return []
            return None
        except Exception as err:
            print("Invalid Input ", err)
            return None

    def get_user_feedback(self, user_data, org_id, service_id):
        """
            Method to get user feedback data.
        """
        try:
            user_rating_dict = {}
            username = user_data['authorizer']['claims']['email']
            query_part = ""
            query_part_values = []
            if org_id is not None:
                query_part = "AND org_id = %s "
                query_part_values.append(org_id)
                if service_id is not None:
                    query_part += "AND service_id = %s "
                    query_part_values.append(service_id)

            rating_query = "SELECT * FROM user_service_vote WHERE username = %s " + query_part
            rating = self.repo.execute(rating_query,
                                       [username] + query_part_values)
            self.obj_utils.clean(rating)

            feedback_query = "SELECT * FROM user_service_feedback WHERE username = %s " + query_part
            feedback = self.repo.execute(feedback_query,
                                         [username] + query_part_values)
            self.obj_utils.clean(feedback)

            for record in feedback:
                org_id = record['org_id']
                service_id = record['service_id']
                if org_id not in user_rating_dict.keys():
                    user_rating_dict[org_id] = {}
                if service_id not in user_rating_dict.keys():
                    user_rating_dict[org_id][service_id] = {}
                    user_rating_dict[org_id][service_id]['comment'] = []
                user_rating_dict[org_id][service_id]['comment'].append(
                    record['comment'])

            for record in rating:
                org_id = record['org_id']
                service_id = record['service_id']
                record.update({
                    'comment':
                    user_rating_dict.get(org_id,
                                         {}).get(service_id,
                                                 {}).get("comment", [])
                })
            return rating
        except Exception as e:
            print(repr(e))
            raise e

    def _set_user_feedback(self, feedback_data, user_data):
        """
            Method to set user rating and feedback.
        """
        try:
            user_rating = str(feedback_data['user_rating'])
            if float(user_rating) > 5.0 or float(user_rating) < 1.0:
                raise Exception(
                    "Invalid Rating. Provided user rating should be between 1.0 and 5.0 ."
                )
            curr_dt = dt.utcnow()
            username = user_data['authorizer']['claims']['email']
            org_id = feedback_data['org_id']
            service_id = feedback_data['service_id']
            comment = feedback_data['comment']
            self.repo.begin_transaction()
            set_rating = "INSERT INTO user_service_vote (username, org_id, service_id, rating, row_updated, row_created) " \
                         "VALUES (%s, %s, %s, %s, %s, %s) " \
                         "ON DUPLICATE KEY UPDATE rating = %s, row_updated = %s"
            set_rating_params = [
                username, org_id, service_id, user_rating, curr_dt, curr_dt,
                user_rating, curr_dt
            ]
            self.repo.execute(set_rating, set_rating_params)
            set_feedback = "INSERT INTO user_service_feedback (username, org_id, service_id, comment, row_updated, row_created)" \
                           "VALUES (%s, %s, %s, %s, %s, %s)"
            set_feedback_params = [
                username, org_id, service_id, comment, curr_dt, curr_dt
            ]
            self.repo.execute(set_feedback, set_feedback_params)
            self._update_service_rating(org_id=org_id, service_id=service_id)
            self.repo.commit_transaction()
            return True
        except Exception as e:
            self.repo.rollback_transaction()
            print(repr(e))
            raise e

    def _get_user_address_from_username(self, username):
        """
            Method to get user_address for a given username
        """
        try:
            wallet_details = self.repo.execute(
                "SELECT * FROM wallet WHERE username = %s ", [username])
            if len(wallet_details) > 0:
                return wallet_details[0].get("address", None)
            else:
                raise Exception("Wallet address does not exist for this user.")
        except Exception as e:
            print(repr(e))
            raise e

    def _update_service_rating(self, org_id, service_id):
        """
            Method updates service_rating and total_user_rated when user rating is changed for given service_id
            and org_id.
        """
        try:
            update_service_metadata = self.repo.execute(
                "UPDATE service_metadata A  INNER JOIN (SELECT U.org_id, U.service_id, AVG(U.rating) AS service_rating, "
                "count(*) AS total_users_rated FROM user_service_vote AS U WHERE U.rating IS NOT NULL GROUP BY "
                "U.service_id, U.org_id ) AS B ON A.org_id=B.org_id AND A.service_id=B.service_id SET A.service_rating "
                "= CONCAT('{\"rating\":', B.service_rating, ' , \"total_users_rated\":', B.total_users_rated, '}') "
                "WHERE A.org_id = %s AND A.service_id = %s ",
                [org_id, service_id])
        except Exception as e:
            print(repr(e))
            raise e

    def set_wallet_details(self,
                           username,
                           address,
                           is_default,
                           status=1,
                           type=DEFAULT_WALLET_TYPE,
                           created_by=CREATED_BY):
        try:
            self.repo.execute(
                "INSERT INTO wallet (username, address, type, is_default, status, created_by, row_updated, row_created) "
                "VALUES (%s, %s, %s, %s, %s, %s, %s, %s)", [
                    username, address, type, is_default, status, created_by,
                    dt.utcnow(),
                    dt.utcnow()
                ])
        except Exception as e:
            print(repr(e))
            raise e

    def register_wallet(self, user_data, wallet_data):
        try:
            is_default = wallet_data["is_default"]
            username = user_data['authorizer']['claims']['email']
            address = wallet_data['address']
            print(is_default)
            if is_default == 1:
                self.repo.begin_transaction()
                self.set_wallet_details(username=username,
                                        address=address,
                                        is_default=is_default)
                self.repo.execute(
                    "UPDATE wallet SET is_default = 0 WHERE username = %s AND address != %s",
                    [username, address])
                self.repo.commit_transaction()
                # need to be cleaned
            else:
                self.set_wallet_details(username=username,
                                        address=address,
                                        is_default=is_default)

            return []
        except Exception as e:
            if is_default is not None and is_default == 1:
                self.repo.rollback_transaction()
            print(repr(e))
            raise e
Ejemplo n.º 25
0
 def login_valid(email, password):
     user = Database.find_one_by('admins', {"email": email})
     if not Utils.unencrypt_pass(password=password, encrypt_password=user['password']):
         return False
     return True
Ejemplo n.º 26
0
 def __init__(self, email, password):
     self.email = email
     self.password = Utils.encrypt_pass(password)
Ejemplo n.º 27
0
from aws_xray_sdk.core import patch_all

from common.logger import get_logger
from common.repository import Repository
from common.utils import Utils, handle_exception_with_slack_notification
from dapp_user.config import NETWORKS, NETWORK_ID, SLACK_HOOK
from dapp_user.constant import SourceDApp
from dapp_user.domain.services.user_service import UserService
from dapp_user.user import User

patch_all()

db = Repository(net_id=NETWORK_ID, NETWORKS=NETWORKS)
logger = get_logger(__name__)
obj_util = Utils()


@handle_exception_with_slack_notification(SLACK_HOOK=SLACK_HOOK, NETWORK_ID=NETWORK_ID, logger=logger)
def request_handler(event, context):
    print(event)
    if 'path' not in event:
        return get_response(400, "Bad Request")
    payload_dict = None
    path = event['path'].lower()
    path = re.sub(r"^(\/dapp-user)", "", path)
    usr_obj = User(obj_repo=db)
    response_data = None

    if event['httpMethod'] == 'POST':
        payload_dict = json.loads(event['body'])
Ejemplo n.º 28
0
 def is_login_valid(cls, email, password):
     user = cls.find_by_email(email)
     for users in user:
         if not Utils.check_hashed_password(password, users.password):
             raise UserErrors.IncorrectPasswordError('The email id or password is incorrect')
     return True
Ejemplo n.º 29
0
 def get_profit_grow(self):
     return Utils.read_data(self.profit_grow_file)
class MonitorServiceCertificate(MonitorService):
    def __init__(self, repo):
        self.repo = repo
        self.route = "/encoding"
        self.obj_util = Utils()
        # regex helps to check url is localhost or external address.
        self.rex_for_pb_ip = "^(http://)*(https://)*127.0.0.1|^(http://)*(https://)*localhost|^(http://)*" \
                             "(https://)*192.|^(http://)*(https://)*172.|^(http://)*(https://)*10."

    def notify_service_contributors_for_certificate_expiration(self):
        service_endpoint_data = self._get_service_endpoint_data(limit=None)
        for record in service_endpoint_data:
            org_id = record["org_id"]
            service_id = record["service_id"]
            endpoint = record["endpoint"]
            expiration_date = self._get_certification_expiration_date_for_given_service(
                endpoint=endpoint)
            days_left_for_expiration = (expiration_date - dt.utcnow()).days
            if days_left_for_expiration < CERTIFICATION_EXPIRATION_THRESHOLD:
                self._send_notification_for_certificate_expiration(
                    org_id=org_id,
                    service_id=service_id,
                    endpoint=endpoint,
                    days_left_for_expiration=days_left_for_expiration)

    def _send_notification_for_certificate_expiration(
            self, org_id, service_id, endpoint, days_left_for_expiration):

        certificate_expiration_notification_subject = \
            self._get_certificate_expiration_email_notification_subject(org_id=org_id, service_id=service_id,
                                                                        endpoint=endpoint)
        certificate_expiration_notification_message = \
            self._get_certificate_expiration_email_notification_message(
                org_id=org_id, service_id=service_id, endpoint=endpoint,
                days_left_for_expiration=days_left_for_expiration)

        recipients = self._get_service_provider_email(org_id=org_id,
                                                      service_id=service_id)
        self._send_email_notification(
            certificate_expiration_notification_subject=
            certificate_expiration_notification_subject,
            certificate_expiration_notification_message=
            certificate_expiration_notification_message,
            recipients=recipients)
        slack_message = self._get_certificate_expiration_slack_notification_message(
            org_id=org_id,
            service_id=service_id,
            endpoint=endpoint,
            days_left_for_expiration=days_left_for_expiration)
        self._send_slack_notification(slack_message=slack_message)

    def _get_certification_expiration_date_for_given_service(self, endpoint):
        endpoint = endpoint.lstrip()
        if self._valid_url(url=endpoint):
            if self._is_https_endpoint(endpoint):
                endpoint = self.obj_util.remove_http_https_prefix(url=endpoint)
                hostname = endpoint.split(":")[0]
                port = endpoint.split(":")[1]
                context = ssl.create_default_context()
                with socket.create_connection((hostname, port)) as sock:
                    with context.wrap_socket(
                            sock, server_hostname=hostname) as ssock:
                        data = json.dumps(ssock.getpeercert())
                        expiration_date = json.loads(data)["notAfter"]
                        return dt.strptime(expiration_date,
                                           "%b %d %H:%M:%S %Y %Z")

    @staticmethod
    def _get_certificate_expiration_email_notification_subject(
            org_id, service_id, endpoint):
        return CERT_EXP_EMAIL_NOTIFICATION_SUBJ % (service_id, NETWORK_NAME)

    @staticmethod
    def _get_certificate_expiration_email_notification_message(
            org_id, service_id, endpoint, days_left_for_expiration):
        return CERT_EXP_EMAIL_NOTIFICATION_MSG % (
            service_id, org_id, NETWORK_NAME, days_left_for_expiration,
            endpoint)

    @staticmethod
    def _get_certificate_expiration_slack_notification_message(
            org_id, service_id, endpoint, days_left_for_expiration):
        return CERT_EXP_SLACK_NOTIFICATION_MSG % (
            service_id, org_id, NETWORK_NAME, days_left_for_expiration,
            endpoint)
Ejemplo n.º 31
0
Archivo: dxf.py Proyecto: itrevex/adds
 def getFileName(self):
     return Utils.dateTimeString() + "-detail.dxf"
Ejemplo n.º 32
0
 def is_login_valid(cls, email: str, password: str) -> bool:
     user = cls.find_by_email(email)
     if not Utils.check_hashed_password(password ,user.password):
         raise UserErrors.IncorrectPasswordError(f"Incorrect password for the user {email}")
     return True
 def send_slack_message(self, slack_msg):
     Utils().report_slack(slack_msg, APPROVAL_SLACK_HOOK)
Ejemplo n.º 34
0
 def __init__(self, obj_repo):
     self.repo = obj_repo
     self.obj_utils = Utils()
     self.ssm_client = boto3.client('ssm', region_name="us-east-1")
Ejemplo n.º 35
0
 def login_valid(email, password):
     user = Database.find_one_by('participants', {'email': email})
     if not Utils.unencrypt_pass(password=password,
                                 encrypt_password=user['password']):
         return False
     return True
Ejemplo n.º 36
0
 def GetPageCount(self):
     strURI = Product.BaseProductUri + "/pdf/" + self.FileName + "/pages"
     signedURI = Utils.Sign(strURI);
     responseStream = Utils.processCommand(signedURI, "GET", "");
     _json = json.loads(responseStream)
     return len(_json)
Ejemplo n.º 37
0
 def __init__(self, obj_repo):
     self.repo = obj_repo
     self.obj_utils = Utils()
Ejemplo n.º 38
0
def main(screen):
    pygame.mouse.set_visible(0)
    # Load image
    background = pygame.image.load("resources\image\TileSet\\background.png").convert()
    img = Utils.load_image('explosion1.gif')
    coins_image = pygame.image.load('resources\image\TileSet\Coins.png')
    Explosion.images = [img, pygame.transform.flip(img, 1, 1)]

    # Load font
    coin_font = pygame.font.Font("resources\Fonts\Number.ttf", 32)

    # Load the sound effects
    boom_sound = Utils.load_sound('boom.wav')
    shoot_sound = Utils.load_sound('1.wav')

    if pygame.mixer:
        music = 'resources/data/1037.wav'
        pygame.mixer.music.load(music)
        pygame.mixer.music.play(-1)

    # Initialize Game Groups
    aliens = pygame.sprite.Group()
    bombs = pygame.sprite.Group()
    monsterbombs = pygame.sprite.Group()
    render_group = pygame.sprite.OrderedUpdates()
    creeps = pygame.sprite.Group()
    items = pygame.sprite.Group()

    # Assign default groups to each sprite class

    # Ground.containers = all_group
    # Player.containers = all_group
    # BasicCreep.containers = all_group, creeps
    coreItem.containers = render_group

    Player.containers = render_group
    Player.screen = screen

    BasicCreep.containers = creeps, render_group
    Bullet.containers = bombs, render_group
    MonsterBullet.containers = monsterbombs,render_group
    Explosion.containers = render_group

    Live_bar.containers = render_group
    Energy_bar.containers = render_group
    Power_bar.containers = render_group

    # Create Some Starting Values
    # Global score

    clock = pygame.time.Clock()


    #ground = Ground()
    player = Player('nhan vat 1', 'character1', 1, 1, 350, screen)

    #*************************************
    # Init creeps
    #*************************************
    BasicCreep.screen = screen
    Player.screen = screen
    #*************************************
    # Init item
    #*************************************

    money_item = money(360, 200, "money")
    items.add(money_item)
    money_item = money(400, 200, "money")
    items.add(money_item)
    money_item = money(440, 200, "money")
    items.add(money_item)
    money_item = money(480, 200, "money")
    items.add(money_item)
    money_item = money(520, 200, "money")
    items.add(money_item)

    money_item = money(360, 80, "money")
    items.add(money_item)
    money_item = money(400, 80, "money")
    items.add(money_item)
    money_item = money(440, 80, "money")
    items.add(money_item)
    money_item = money(480, 80, "money")
    items.add(money_item)
    money_item = money(520, 80, "money")
    items.add(money_item)

    money_item = money(680, 40, "money")
    items.add(money_item)
    money_item = money(720, 40, "money")
    items.add(money_item)
    money_item = money(760, 40, "money")
    items.add(money_item)
    money_item = money(800, 40, "money")
    items.add(money_item)
    money_item = money(840, 40, "money")
    items.add(money_item)

    money_item = money(1600, 180, "money")
    items.add(money_item)
    money_item = money(1640, 180, "money")
    items.add(money_item)
    money_item = money(1680, 180, "money")
    items.add(money_item)
    money_item = money(1720, 180, "money")
    items.add(money_item)
    money_item = money(2592, 128, "money")
    items.add(money_item)
    money_item = money(2624, 128, "money")
    items.add(money_item)
    money_item = money(2656, 128, "money")
    items.add(money_item)
    money_item = money(2688, 128, "money")
    items.add(money_item)
    money_item = money(3744, 384, "money")
    items.add(money_item)
    money_item = money(3776, 384, "money")
    items.add(money_item)
    money_item = money(3808, 384, "money")
    items.add(money_item)
    money_item = money(3840, 384, "money")
    items.add(money_item)
    money_item = money(4736, 64, "money")
    items.add(money_item)
    money_item = money(4736, 32, "money")
    items.add(money_item)
    money_item = money(4768, 64, "money")
    items.add(money_item)
    money_item = money(4768, 32, "money")
    items.add(money_item)
    money_item = money(4800, 64, "money")
    items.add(money_item)
    money_item = money(4800, 32, "money")
    items.add(money_item)
    money_item = money(4832, 64, "money")
    items.add(money_item)
    money_item = money(4832, 32, "money")
    items.add(money_item)
    money_item = money(4864, 64, "money")
    items.add(money_item)
    money_item = money(4896, 32, "money")
    items.add(money_item)
    money_item = money(4928, 64, "money")
    items.add(money_item)
    money_item = money(4928, 32, "money")
    items.add(money_item)
    money_item = money(4960, 64, "money")
    items.add(money_item)
    money_item = money(4992, 32, "money")
    items.add(money_item)
    money_item = money(5024, 64, "money")
    items.add(money_item)
    money_item = money(5024, 32, "money")
    items.add(money_item)
    money_item = money(5056, 64, "money")
    items.add(money_item)
    money_item = money(5056, 32, "money")
    items.add(money_item)
    money_item = money(5088, 64, "money")
    items.add(money_item)
    money_item = money(5088, 32, "money")
    items.add(money_item)
    money_item = money(5120, 64, "money")
    items.add(money_item)
    money_item = money(5120, 32, "money")
    items.add(money_item)
    money_item = money(5152, 64, "money")
    items.add(money_item)
    money_item = money(5152, 32, "money")
    items.add(money_item)
    money_item = money(5184, 64, "money")
    items.add(money_item)
    money_item = money(5184, 32, "money")
    items.add(money_item)
    money_item = money(5216, 64, "money")
    items.add(money_item)
    money_item = money(5216, 32, "money")
    items.add(money_item)
    money_item = money(5248, 64, "money")
    items.add(money_item)
    money_item = money(5248, 32, "money")
    items.add(money_item)

    money_item = berry(2890, 100, "berry")
    items.add(money_item)


    money_item = money(5440, 192, "money")
    items.add(money_item)
    money_item = money(5472, 192, "money")
    items.add(money_item)
    money_item = money(5504, 192, "money")
    items.add(money_item)
    money_item = money(5472, 192, "money")
    items.add(money_item)

    money_item = money(5792, 160, "money")
    items.add(money_item)
    money_item = money(5824, 160, "money")
    items.add(money_item)
    money_item = money(5856, 160, "money")
    items.add(money_item)
    money_item = money(5888, 160, "money")
    items.add(money_item)

    money_item = money(6080, 160, "money")
    items.add(money_item)
    money_item = money(6112, 160, "money")
    items.add(money_item)
    money_item = money(6144, 160, "money")
    items.add(money_item)

    CreepManager.create_creep(creeps, 'A', 365, 332, 365, 480, 0, 1)
    CreepManager.create_creep(creeps, 'A', 611, 332, 576, 989, 0, 1)
    CreepManager.create_creep(creeps, 'A', 874, 332, 576, 989, 1, 1)
    CreepManager.create_creep(creeps, 'D', 1472+10, 316-50, 1472+10, 1588, 1, 1)
    CreepManager.create_creep(creeps, 'D', 1218+10, 380-50, 1218+10, 1374, 1, 1)

    CreepManager.create_creep(creeps, 'B', 1280+20, 508-30, 1280+20, 1374-20, 1, 1)
    CreepManager.create_creep(creeps, 'B', 1474+20, 508-30, 1474+20, 1628-50, 1, 1)
    CreepManager.create_creep(creeps, 'B', 1664+45, 508-30, 1664+45, 1782-20, 1, 1)

    CreepManager.create_creep(creeps, 'A', 2592+45, 442-48, 2592+45, 2876-20, 1, 1)
    CreepManager.create_creep(creeps, 'F', 2592+45, 100, 2592+45, 2876-20, 1, 4)

    CreepManager.create_creep(creeps, 'B', 3302+45, 442 - 30, 3302+45-20, 3548-20, 1, 2)
    CreepManager.create_creep(creeps, 'F', 3312+45, 300, 3302+45-20, 3548-20, 1, 4)
    CreepManager.create_creep(creeps, 'F', 3400, 200, 3302+45-20, 3548-20, 0, 3)
    CreepManager.create_creep(creeps, 'F', 3390, 70, 3302+45-20, 3548-20, 0, 3)

    CreepManager.create_creep(creeps, 'A', 3840+55, 442 - 15, 3840+50, 4000-20-20, 0, 1)

    CreepManager.create_creep(creeps, 'A', 4706+55, 362, 4706, 4862-20, 0, 1)

    CreepManager.create_creep(creeps, 'C', 5365, 162, 5365, 6000, 0, 4)
    CreepManager.create_creep(creeps, 'C', 5365, 62, 5365, 6000, 0, 4)

    CreepManager.create_creep(creeps, 'B', 6505, 316, 6505, 6645, 0, 4)

    CreepManager.create_creep(creeps, 'A_SPECIAL', 4917, 381, 4907, 5033, 0, 1)

    tileset = TileCache("resources/image/TileSet/ImageSheet.png", Constant.TILE_WIDTH, Constant.TILE_HEIGHT).load_tile_table()
    invisible_tiles = (((9,14), (9,15), (9, 16),(9, 17)),
                        ((6, 19), (6, 20), (6, 21), (6,22)),
                       ((12, 68), (12, 69), (12, 70), (13, 70), (14, 70)),
                       ((5, 81), (5, 82), (5, 83), (5, 84)),
                       ((7,144), (7, 145), (6, 146), (6, 147)))

    """ CREATE LIST OF SPECIAL OBJECTS """
    special_tiles = []
    for line in invisible_tiles:
        for element in line:
            special_tile = SpecialObject(tileset, element, (Constant.TILE_WIDTH * element[1], Constant.TILE_HEIGHT * element[0]))
            special_tiles.append(special_tile)

    camera_left = 0
    camera_right = Constant.SCREENRECT.width
    hCount = 1

    player.typeOfBullet = EBulletType.BASIC
    mymonster = monster(7400, 270, "monster")
    items.add(mymonster)
    player.sound_money = pygame.mixer.Sound('resources/data/yahoo.ogg')
    # Main loop
    while player.health > -10:

        # CREEP MANAGER
        CreepManager.update(creeps, player.pos[0], player.pos[1], player.rect.left)
        CreepManager.create_creep_dynamic(player.pos[0], creeps)
        if player.state == Constant.DIE_STATE:
            player.health -= 0.1

        # Get input
        player1_down_to_up = player.fire_down

        for event in pygame.event.get():
            if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                return
            elif event.type == KEYDOWN:
                if event.key == Constant.PLAYER1FIREKEY:
                    player.fire_down = True
                elif event.key == Constant.PLAYER1CHANGEBULLET:
                    player.typeOfBullet += 1
                    if player.typeOfBullet >= Constant.NUM_BULLET_TYPE:
                        player.typeOfBullet = EBulletType.BASIC
                elif event.key == Constant.PLAYER1JUMPKEY:
                    if not player.downable:
                        player.jump = 20
            elif event.type == KEYUP:
                if event.key == Constant.PLAYER1FIREKEY:
                    player.fire_down = False
                    if player.enegery >= 20:
                        player.state = Constant.THROW_STATE

        # Clear/erase the last drawn sprites
        render_group.clear(screen, background)
        screen.fill((0, 0, 0))
        if (camera_right < Constant.SCREENRECT.width * 8):
            if camera_left < (hCount - 1) * background.get_width():
                hCount -= 1
            elif (camera_left < hCount * background.get_width()):
                if (camera_right > hCount * background.get_width()):
                        screen.blit(background, (0  - camera_left + (hCount - 1) * background.get_width(), 0))
                        screen.blit(background, (hCount * background.get_width() - camera_left, 0))
                else:
                        screen.blit(background, (0  - camera_left + (hCount -1) * background.get_width(), 0))
            else:
                hCount += 1

        tiles = []
        for y in range(int(camera_left) / Constant.TILE_WIDTH, (int(camera_right) / Constant.TILE_WIDTH) + 1):
            if y > 239:
                y = 239
            for x in range(0, 20):
                if Constant.MAP[x][y] is not 0:
                    tile = Tile(tileset, (x, y), (32 * y, 32 * x))
                    for line in invisible_tiles:
                        if tile.id in line:
                            tile.visible = False
                            break
                    if tile.visible:
                        screen.blit(tile.image, (Constant.TILE_WIDTH * y - camera_left, Constant.TILE_HEIGHT * x))
                    tiles.append(tile)

        # Update all the sprites
        render_group.update()
        monsterbombs.update()
        
        for item in items.sprites():
            item.update_pos(player.pos[0], player.rect.left)

        screen.blit(coins_image, (440, 0))
        screen.blit(coin_font.render(' X  ' + str(player.money), True, (0, 0, 0)), (480, 0))
        items.update()

        # Handle player input
        key_state = pygame.key.get_pressed()

        player.check(key_state)

        if player1_down_to_up and not player.fire_down and player.enegery >= 25:
            if player.typeOfBullet == EBulletType.BASIC:
                butllet = Bullet(player.angle, player.power, player, "fireball.png")
                shoot_sound.play()
                player.enegery -= butllet.energy_cost
            else:
                butllet = Bullet(player.angle, player.power, player, "simple.png")
                butllet = Bullet(player.angle+10, player.power, player, "simple.png")
                butllet = Bullet(player.angle-10, player.power, player, "simple.png")
                shoot_sound.play()
                player.enegery -= butllet.energy_cost

        # *************************************************************
        # CHECK COLLISION HERE!
        # *************************************************************
        for b in bombs.sprites():
            b.update_pos(player.pos[0], player.rect.x)



        """ COLLIDE WITH SPECIAL OBJECT"""
        for tile in tiles:
            if tile.id ==  (11, 21) and Utils.check_collision(player, tile):
                for special_tile in special_tiles:
                    if special_tile.id in invisible_tiles[0]:
                        special_tile.visible = True
            if tile.id == (11, 27) and Utils.check_collision(player, tile):
                for special_tile in special_tiles:
                    if special_tile.id in invisible_tiles[1]:
                        special_tile.visible = True
            if tile.id == (14, 58) and Utils.check_collision(player, tile):
                for special_tile in special_tiles:
                    if special_tile.id in invisible_tiles[2]:
                        special_tile.visible = True
            if tile.id == (6, 77) and Utils.check_collision(player, tile):
                for special_tile in special_tiles:
                    if special_tile.id in invisible_tiles[3]:
                        special_tile.visible = True
            if tile.id == (9, 143) and Utils.check_collision(player, tile):
                for special_tile in special_tiles:
                    if special_tile.id in invisible_tiles[4]:
                        special_tile.visible = True
        for special_tile in special_tiles:
            if special_tile.visible:
                screen.blit(special_tile.image, (Constant.TILE_WIDTH * special_tile.id[1] - camera_left, Constant.TILE_HEIGHT * special_tile.id[0]))
        """ OUT OF MAP"""
        if (player.pos[1] + Constant.PLAYERHEIGHT >= Constant.SCREENRECT.height):
            game_state = Constant.GAMEOVER
            break

        """PLAYER GOES DOWN"""
        player.downable = True
        for tile in tiles:
            is_Visible = True
            for special_tile in special_tiles:
                if special_tile.id == tile.id and special_tile.visible == False:
                    is_Visible = False
                    break
            if not is_Visible :
                continue
            if tile.downable == True:
                continue;
            if (player.pos[0]  >= tile.pos[0] and player.pos[0]  <= tile.pos[0] + Constant.TILE_WIDTH) \
                    or ( player.pos[0] + Constant.PLAYERWIDTH  >= tile.pos [0] and player.pos[0] + Constant.PLAYERWIDTH  <= tile.pos[0] + Constant.TILE_WIDTH):
                if (player.pos[1] + Constant.PLAYERHEIGHT  >= tile.pos[1] and player.pos[1] + Constant.PLAYERHEIGHT <= tile.pos[1] + Constant.TILE_HEIGHT):
                    player.downable = False
                    break;
        """ WALL BLOCK """
        player.isBlockByWall = False
        for tile in tiles:
            is_Visible = True
            for special_tile in special_tiles:
                if special_tile.id == tile.id and special_tile.visible == False:
                    is_Visible = False
                    break
            if is_Visible and tile.isBlockByWall == True and player.pos[1] <= tile.pos[1] and player.pos[1] + Constant.PLAYERHEIGHT >= tile.pos[1] \
                and player.pos[1] > tile.pos[1] - Constant.TILE_HEIGHT:
                """ Player goes to the right """

                if player.direction == 1:
                    if player.pos[0] + Constant.PLAYERWIDTH + player.speed>= tile.pos[0] \
                            and player.pos[0] + Constant.PLAYERWIDTH  + player.speed <= tile.pos[0] + Constant.TILE_WIDTH:

                        player.isBlockByWall = True
                else:
                    if player.pos[0] - player.speed  >= tile.pos[0] \
                            and player.pos[0] - player.speed <= tile.pos[0] + Constant.TILE_WIDTH:
                        player.isBlockByWall = True
        """ GROUND BLOCK """
        player.is_block_by_ground = False
        for tile in tiles:
            is_Visible = True
            for special_tile in special_tiles:
                if special_tile.id == tile.id and special_tile.visible == False:
                    is_Visible = False
                    break
            if is_Visible and tile.isBlockByGround and player.jump > 0 and player.pos[1] >= tile.pos[1] and player.pos[1] <= tile.pos[1] + Constant.TILE_HEIGHT:
                if(player.pos[0]  >= tile.pos[0] and player.pos[0]  <= tile.pos[0] + Constant.TILE_WIDTH) \
                or ( player.pos[0] + Constant.PLAYERWIDTH  >= tile.pos [0] and player.pos[0] + Constant.PLAYERWIDTH  <= tile.pos[0] + Constant.TILE_WIDTH):
                    player.jump = 0

        """ Move with world """
        if not player.isBlockByWall and player.state == Constant.MOVE_STATE:
            if (((player.pos[0] + player.direction * player.speed) >= 0 ) and (player.pos[0] + player.direction * player.speed <= Constant.SCREENRECT.width * 8)):
                player.pos[0] += player.direction * player.speed
            if (camera_left + player.direction * player.speed >= 0) and (camera_right + player.direction * player.speed < Constant.SCREENRECT.width * 8):
                camera_left += player.direction * player.speed
                camera_right += player.direction * player.speed
                player.moveWithScreen = False
            else:
                player.moveWithScreen = True



        dict_collide = pygame.sprite.groupcollide(bombs, creeps, True, False)
        for key in dict_collide.keys():
            boom_sound.play()
            Explosion(key)
            for creep in dict_collide[key]:
                if not isinstance(creep, CreepASpecial):
                    creep.kill()
                else:
                    creep.check_die()
        #check va cham cua player voi dan cua monster
        dict_collide1 = pygame.sprite.spritecollide(player,monsterbombs, True)
        for key in dict_collide1:
            boom_sound.play()
            Explosion(key)
            player.lost_blood(70)
        #check va cham cua monster voi dan cua player
        if mymonster:
            dict_collide2 = pygame.sprite.spritecollide(mymonster,bombs, True)
            for key in dict_collide2:
                boom_sound.play()
                Explosion(key)
                mymonster.lost_blood(5)

        if pygame.sprite.spritecollide(player, creeps, True):
            player.lost_blood(40)

        item_collides = pygame.sprite.spritecollide(player, items, True)
        for item in item_collides:
            if isinstance(item, berry):
                player.typeOfBullet = EBulletType.THREE
                continue
            #item.playEffect()
            player.sound_money.play()
            player.money += 1
            player.enegery += 5

        for b in monsterbombs.sprites():
           b.update_pos(player.pos[0], player.rect.x)

        dirty = render_group.draw(screen)  # Draw all sprite, return list of rect
        pygame.display.update(dirty)    # Draw only changed rect
        pygame.display.flip()
        # Cap the frame rate
        clock.tick(Constant.FPS)
        #Clear tile list
        tiles[:] = []


    game_state = Constant.GAMEOVER

    game_over(screen, game_state)
Ejemplo n.º 39
0
class Service:
    def __init__(self, obj_repo):
        self.repo = obj_repo
        self.obj_utils = Utils()

    def get_group_info(self, org_id=None, srvc_id=None):
        print('Inside grp info')
        service_status_dict = {}
        try:
            if org_id is None:
                status = self.repo.execute(
                    "SELECT G.*, S.endpoint, S.is_available, S.last_check_timestamp FROM service_group G, " \
                    "service_status S WHERE G.service_row_id = S.service_row_id AND G.group_id = S.group_id " \
                    "AND G.service_row_id IN (SELECT row_id FROM service WHERE is_curated = 1)")
            elif org_id is not None and srvc_id is None:
                query = "SELECT G.*, S.endpoint, S.is_available, S.last_check_timestamp FROM service_group G, " \
                        "service_status S WHERE G.service_row_id = S.service_row_id AND G.group_id = S.group_id " \
                        "AND G.service_row_id IN (SELECT row_id FROM service WHERE is_curated = 1 and org_id = %s)"
                status = self.repo.execute(query, org_id)
            else:
                query = "SELECT G.*, S.endpoint, S.is_available, S.last_check_timestamp FROM service_group G, " \
                        "service_status S WHERE G.service_row_id = S.service_row_id AND G.group_id = S.group_id " \
                        "AND G.service_row_id IN (SELECT row_id FROM service WHERE is_curated = 1 and org_id = %s " \
                        "AND service_id = %s ) "
                status = self.repo.execute(query, [org_id, srvc_id])

            self.obj_utils.clean(status)
            for rec in status:
                srvc_rw_id = rec['service_row_id']
                grp_id = rec['group_id']
                endpoint_value = {
                    'is_available': rec['is_available'],
                    'last_check_timestamp': rec['last_check_timestamp']
                }
                endpoint = rec['endpoint']
                if srvc_rw_id not in service_status_dict.keys():
                    service_status_dict[srvc_rw_id] = {
                        'service_id': rec['service_id'],
                        'org_id': rec['org_id']
                    }
                    service_status_dict[srvc_rw_id]['grp'] = {}
                if grp_id not in service_status_dict.get(srvc_rw_id).keys():
                    service_status_dict[srvc_rw_id]['grp'][grp_id] = {}
                    service_status_dict[srvc_rw_id]['grp'][grp_id][
                        'payment_address'] = rec['payment_address']
                    service_status_dict[srvc_rw_id]['grp'][grp_id][
                        'endpoint'] = {}
                service_status_dict[srvc_rw_id]['grp'][grp_id][
                    'endpoint'].update({endpoint: endpoint_value})
            service_status = self.process_service_status(service_status_dict)
        except Exception as e:
            print(repr(e))
            raise e
        return service_status

    def process_service_status(self, service_status_dict):
        service_status = []
        for srvc_rw_id in service_status_dict.keys():
            is_available = 0
            grps_dict = service_status_dict.get(srvc_rw_id, {})
            grps = []
            for grp_id in grps_dict['grp'].keys():
                grp_available = 0
                endpts_dict = grps_dict['grp'].get(grp_id, {})
                endpts = []
                for endpt in endpts_dict['endpoint'].keys():
                    endpt_available = endpts_dict['endpoint'][endpt].get(
                        'is_available', None)
                    last_check_timestamp = endpts_dict['endpoint'][endpt].get(
                        'last_check_timestamp', None)
                    endpts.append({
                        'endpoint': endpt,
                        'is_available': endpt_available,
                        'last_check_timestamp': last_check_timestamp
                    })
                    grp_available = grp_available or endpt_available
                is_available = is_available or grp_available
                grps.append({
                    'group_id':
                    grp_id,
                    'endpoints':
                    endpts,
                    'is_available':
                    grp_available,
                    'payment_address':
                    endpts_dict.get('payment_address', '')
                })
            service_status.append({
                'service_row_id': srvc_rw_id,
                'service_id': grps_dict['service_id'],
                'org_id': grps_dict['org_id'],
                'groups': grps,
                'is_available': is_available
            })
        return service_status

    def fetch_total_count(self):
        user_vote_count_dict = {}
        try:
            count_details = self.repo.execute(
                "SELECT org_id, service_id, vote, Count(*) AS count FROM user_service_vote GROUP BY vote, service_id, org_id"
            )
            for rec in count_details:
                org_id = rec.get('org_id', '')
                service_id = rec.get('service_id', '')
                vote = rec.get('vote', '')
                count = rec.get('count', '')
                if not org_id in user_vote_count_dict.keys():
                    user_vote_count_dict[org_id] = {}
                if not service_id in user_vote_count_dict[org_id].keys():
                    user_vote_count_dict[org_id][service_id] = {}
                user_vote_count_dict[org_id][service_id][vote] = count
        except Exception as e:
            print(repr(e))
            raise e
        return user_vote_count_dict

    def vote_mapping(self, vote):
        return {'up_vote': (vote == 1), 'down_vote': (vote == 0)}

    def fetch_user_vote(self, user_address):
        user_vote_dict = {}
        try:
            votes = self.repo.execute(
                "SELECT * FROM user_service_vote WHERE user_address = %s",
                (user_address))
            self.obj_utils.clean(votes)
            for rec in votes:
                org_id = rec['org_id']
                service_id = rec['service_id']
                comment = rec.get('comment', None)
                if org_id not in user_vote_dict.keys():
                    user_vote_dict[org_id] = {}
                user_vote_dict[org_id][service_id] = {
                    'user_address': rec['user_address'],
                    'org_id': rec['org_id'],
                    'service_id': service_id,
                    'comment': comment
                }
                user_vote_dict[org_id][service_id].update(
                    self.vote_mapping(rec['vote']))

        except Exception as e:
            print(repr(e))
            raise e
        return user_vote_dict

    def get_user_vote(self, user_address):
        vote_list = []
        try:
            count_details = self.fetch_total_count()
            votes = self.fetch_user_vote(user_address)
            for org_id in count_details.keys():
                srvcs_data = count_details[org_id]
                for service_id in srvcs_data.keys():
                    rec = {
                        'org_id':
                        org_id,
                        'service_id':
                        service_id,
                        'up_vote_count':
                        srvcs_data.get(service_id).get(1, 0),
                        'down_vote_count':
                        srvcs_data.get(service_id).get(0, 0),
                        "up_vote":
                        votes.get(org_id, {}).get(service_id,
                                                  {}).get('up_vote', False),
                        "down_vote":
                        votes.get(org_id, {}).get(service_id,
                                                  {}).get('down_vote', False)
                    }
                    vote_list.append(rec)
        except Exception as e:
            print(repr(e))
            raise e
        return vote_list

    def fetch_user_feedbk(self, user_address):
        user_vote_dict = {}
        try:
            votes = self.repo.execute(
                "SELECT * FROM user_service_vote WHERE user_address = %s",
                (user_address))
            self.obj_utils.clean(votes)
            feedbk = self.repo.execute(
                "SELECT A.* FROM user_service_feedback A INNER JOIN (SELECT user_address,org_id, service_id,  "
                "max(row_updated) latest_dt FROM user_service_feedback WHERE user_address = %s GROUP BY user_address, "
                "org_id, service_id) B  on A.user_address = B.user_address AND A.org_id = B.org_id AND A.service_id = "
                "B.service_id AND A.row_updated = B.latest_dt", (user_address))
            self.obj_utils.clean(feedbk)
            for rec in votes:
                org_id = rec['org_id']
                service_id = rec['service_id']
                if org_id not in user_vote_dict.keys():
                    user_vote_dict[org_id] = {}
                user_vote_dict[org_id][service_id] = {
                    'user_address': rec['user_address'],
                    'org_id': rec['org_id'],
                    'service_id': service_id
                }
                user_vote_dict[org_id][service_id].update(
                    self.vote_mapping(rec['vote']))
            for rec in feedbk:
                org_id = rec['org_id']
                service_id = rec['service_id']
                user_vote_dict[org_id][service_id]['comment'] = rec['comment']

        except Exception as e:
            print(repr(e))
            raise e
        return user_vote_dict

    def get_usr_feedbk(self, user_address):
        vote_list = []
        try:
            count_details = self.fetch_total_count()
            votes = self.fetch_user_feedbk(user_address)
            for org_id in count_details.keys():
                srvcs_data = count_details[org_id]
                for service_id in srvcs_data.keys():
                    rec = {
                        'org_id':
                        org_id,
                        'service_id':
                        service_id,
                        'up_vote_count':
                        srvcs_data.get(service_id).get(1, 0),
                        'down_vote_count':
                        srvcs_data.get(service_id).get(0, 0),
                        "up_vote":
                        votes.get(org_id, {}).get(service_id,
                                                  {}).get('up_vote', False),
                        "down_vote":
                        votes.get(org_id, {}).get(service_id,
                                                  {}).get('down_vote', False),
                        "comment":
                        votes.get(org_id, {}).get(service_id,
                                                  {}).get('comment', None)
                    }
                    vote_list.append(rec)
        except Exception as e:
            print(repr(e))
            raise e
        return vote_list

    def is_valid_vote(self, net_id, vote_info_dict):
        try:
            provider = web3.HTTPProvider(NETWORKS[net_id]['http_provider'])
            w3 = web3.Web3(provider)

            message_text = str(vote_info_dict['user_address']) + str(vote_info_dict['org_id']) + \
                           str(vote_info_dict['up_vote']).lower() + str(vote_info_dict['service_id']) + \
                           str(vote_info_dict['down_vote']).lower()
            message = w3.sha3(text=message_text)
            message_hash = defunct_hash_message(primitive=message)
            recovered = str(
                w3.eth.account.recoverHash(
                    message_hash, signature=vote_info_dict['signature']))
            return str(
                vote_info_dict['user_address']).lower() == recovered.lower()
        except Exception as e:
            print(repr(e))
            raise e

        return False

    def set_user_vote(self, vote_info_dict, net_id):
        try:
            vote = -1
            if vote_info_dict['up_vote']:
                vote = 1
            elif vote_info_dict['down_vote']:
                vote = 0
            if self.is_valid_vote(net_id=net_id,
                                  vote_info_dict=vote_info_dict):
                query = "Insert into user_service_vote (user_address, org_id, service_id, vote, row_created) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE VOTE = %s"
                q_params = [
                    vote_info_dict['user_address'], vote_info_dict['org_id'],
                    vote_info_dict['service_id'], vote,
                    datetime.datetime.utcnow(), vote
                ]
                res = self.repo.execute(query, q_params)
            else:
                raise Exception("Signature of the vote is not valid.")
        except Exception as e:
            print(repr(e))
            raise e
        return True

    def is_valid_feedbk(self, net_id, usr_addr, msg_txt, sign):
        try:
            provider = web3.HTTPProvider(NETWORKS[net_id]['http_provider'])
            w3 = web3.Web3(provider)
            message = w3.sha3(text=msg_txt)
            message_hash = defunct_hash_message(primitive=message)
            recovered = str(
                w3.eth.account.recoverHash(message_hash, signature=sign))
            return str(usr_addr).lower() == recovered.lower()
        except Exception as e:
            print(repr(e))
            raise e
        return False

    def set_usr_feedbk(self, feedbk_info, net_id):
        try:
            vote = -1
            if feedbk_info['up_vote']:
                vote = 1
            elif feedbk_info['down_vote']:
                vote = 0
            curr_dt = datetime.datetime.utcnow()
            usr_addr = feedbk_info['user_address']
            org_id = feedbk_info['org_id']
            srvc_id = feedbk_info['service_id']
            comment = feedbk_info['comment']
            msg_txt = str(usr_addr) + str(org_id) + str(feedbk_info['up_vote']).lower() + str(srvc_id) + \
                      str(feedbk_info['down_vote']).lower() + str(comment).lower()
            if self.is_valid_feedbk(net_id=net_id,
                                    usr_addr=usr_addr,
                                    msg_txt=msg_txt,
                                    sign=feedbk_info['signature']):
                self.repo.begin_transaction()
                insrt_vote = "INSERT INTO user_service_vote (user_address, org_id, service_id, vote, row_updated, row_created) " \
                             "VALUES (%s, %s, %s, %s, %s, %s) " \
                             "ON DUPLICATE KEY UPDATE vote = %s, row_updated = %s"
                insrt_vote_params = [
                    usr_addr, org_id, srvc_id, vote, curr_dt, curr_dt, vote,
                    curr_dt
                ]
                self.repo.execute(insrt_vote, insrt_vote_params)

                insrt_feedbk = "INSERT INTO user_service_feedback (user_address, org_id, service_id, comment, " \
                               "row_updated, row_created)" \
                               "VALUES (%s, %s, %s, %s, %s, %s) "
                insrt_feedbk_params = [
                    usr_addr, org_id, srvc_id, comment, curr_dt, curr_dt
                ]
                self.repo.execute(insrt_feedbk, insrt_feedbk_params)
                self.repo.commit_transaction()
            else:
                raise Exception("signature of the vote is not valid.")
        except MySQLError as e:
            self.repo.rollback_transaction()
            raise e
        except Exception as err:
            print(repr(err))
            raise err
        return True

    def get_curated_services(self):
        try:
            services = self.repo.execute(
                "SELECT * FROM service S, service_metadata M WHERE S.row_id = M.service_row_id AND S.is_curated = 1"
            )
            groups = self.repo.execute("SELECT G.*, E.* FROM service S, service_group G, service_endpoint E WHERE " \
                                       "G.group_id = E.group_id AND G.service_row_id = S.row_id AND " \
                                       "E.service_row_id = S.row_id AND S.is_curated = 1")
            tags = self.repo.execute(
                "SELECT T.* FROM service S, service_tags T WHERE T.service_row_id = S.row_id AND S.is_curated = 1"
            )
            grouped_services = self.__merge_service_data(
                services, groups, tags)
        except Exception as e:
            print(repr(e))
            raise e
        return grouped_services

    def get_profile_details(self, user_address):
        try:
            mpe_details = list()
            qry = "SELECT  G.org_id, D.display_name, M.* FROM mpe_channel M, service_group G ,service_metadata D, " \
                  "organization O WHERE M.groupId = G.group_id AND M.recipient = G.payment_address AND " \
                  "D.service_row_id =  G.service_row_id AND O.org_id = G.org_id AND sender = %s "
            channel_details = self.repo.execute(qry, (user_address))
            for detail in channel_details:
                mpe_details.append(self.obj_utils.clean_row(detail))
        except Exception as e:
            print(repr(e))
            raise e
        return mpe_details

    def __merge_service_data(self, services, groups, tags):
        tag_map = self.__map_to_service(tags)
        groups_map = self.__map_to_service(groups)
        for service in services:
            self.obj_utils.clean_row(service)
            service_row_id = service['service_row_id']
            service['groups'] = self.__get_group_with_endpoints(
                groups_map[service_row_id])
            if service_row_id in tag_map:
                service['tags'] = [
                    tag['tag_name'] for tag in tag_map[service_row_id]
                ]
            else:
                service['tags'] = []

        return services

    def __map_to_service(self, rows):
        map = dict()
        for row in rows:
            service_id = row['service_row_id']
            if service_id not in map:
                map[service_id] = list()
            map[service_id].append(row)
        return map

    def __get_group_with_endpoints(self, groups):
        segregated_groups = dict()
        for group in groups:
            group_name = group['group_name']
            if group_name not in segregated_groups:
                group_details = dict()
                group_details['endpoints'] = list()
                segregated_groups[group_name] = group_details
            else:
                group_details = segregated_groups[group_name]

            group_details['payment_address'] = group['payment_address']
            group_details['group_id'] = group['group_id']
            group_details['endpoints'].append(group['endpoint'])
        return segregated_groups
 def __init__(self, repo, net_id):
     self.repo = repo
     self.route = "/encoding"
     self.rex_for_pb_ip = "^(http://)*(https://)*127.0.0.1|^(http://)*(https://)*localhost|^(http://)*(https://)*192.|^(http://)*(https://)*172.|^(http://)*(https://)*10."
     self.obj_util = Utils()
     self.net_id = net_id
 def send_slack_alert(self, unsuccessful_files):
     slack_msg = f"Failed to delete files\n```{unsuccessful_files}```"
     return Utils().report_slack(slack_msg=slack_msg, SLACK_HOOK=SLACK_HOOK)
Ejemplo n.º 42
0
class OrderService:
    def __init__(self, obj_repo):
        self.repo = obj_repo
        self.obj_transaction_history_dao = TransactionHistoryDAO(self.repo)
        self.lambda_client = boto3.client('lambda', region_name=REGION_NAME)
        self.boto_client = BotoUtils(REGION_NAME)
        self.wallet_service = WalletService()
        self.obj_blockchain_util = BlockChainUtil(
            provider_type="HTTP_PROVIDER",
            provider=NETWORKS[NETWORK_ID]['http_provider']
        )
        self.utils = Utils()

    def initiate_order(self, username, payload_dict):
        """
            Initiate Order
                Step 1  Order Creation
                Step 2  Initiate Payment
                Step 3  Persist Transaction History
        """
        price = payload_dict["price"]
        order_type = payload_dict["item_details"]["order_type"]
        item_details = payload_dict["item_details"]
        group_id = item_details["group_id"]
        org_id = item_details["org_id"]
        channel_id = ""
        amount_in_cogs = self.calculate_amount_in_cogs(amount=price["amount"], currency=price["currency"])
        if amount_in_cogs < 1:
            raise Exception("Amount in cogs should be greater than equal to 1")
        item_details["amount_in_cogs"] = amount_in_cogs

        if order_type == OrderType.CREATE_WALLET_AND_CHANNEL.value:
            item_details["wallet_address"] = ""
            recipient = self.get_payment_address_for_org(group_id=group_id, org_id=org_id)

        elif order_type == OrderType.CREATE_CHANNEL.value:
            recipient = self.get_payment_address_for_org(group_id=group_id, org_id=org_id)

        elif order_type == OrderType.FUND_CHANNEL.value:
            channel = self.get_channel_for_topup(username=username, group_id=group_id, org_id=org_id)
            if channel is None:
                raise Exception(f"Channel not found for the user: {username} with org: {org_id} group: {group_id}")
            recipient = channel["recipient"]
            channel_id = channel["channel_id"]
            item_details["wallet_address"] = channel["address"]

        else:
            raise Exception("Invalid order type")

        item_details["channel_id"] = channel_id
        item_details["recipient"] = recipient
        order_details = self.manage_create_order(
            username=username, item_details=item_details,
            price=price
        )
        order_id = order_details["order_id"]

        try:
            payment_data = self.manage_initiate_payment(
                username=username, order_id=order_id, price=price,
                payment_method=payload_dict["payment_method"]
            )

            payment_id = payment_data["payment_id"]
            raw_payment_data = json.dumps(payment_data["payment"])
            obj_transaction_history = TransactionHistory(
                username=username, order_id=order_id, order_type=order_type,
                payment_id=payment_id, raw_payment_data=raw_payment_data,
                status=Status.PAYMENT_INITIATED.value
            )
            self.obj_transaction_history_dao.insert_transaction_history(obj_transaction_history=obj_transaction_history)
            return payment_data
        except Exception as e:
            obj_transaction_history = TransactionHistory(
                username=username, order_id=order_id, order_type=order_type,
                status=Status.PAYMENT_INITIATION_FAILED.value
            )
            self.obj_transaction_history_dao.insert_transaction_history(obj_transaction_history=obj_transaction_history)
            print(repr(e))
            raise e

    def get_channel_for_topup(self, username, group_id, org_id):
        channel_details = self.wallet_service.get_channel_details(
            username=username, group_id=group_id, org_id=org_id
        )
        wallets = channel_details["wallets"]
        for wallet in wallets:
            if (wallet["type"] == "GENERAL") and len(wallet["channels"]) > 0:
                if wallet["channels"][0]["signer"] == SIGNER_ADDRESS:
                    wallet_address = wallet["address"]
                    channel = wallet["channels"][0]
                    channel["address"] = wallet_address
                    return channel
        return None

    def get_payment_address_for_org(self, org_id, group_id):

        group_details_event = {
            "path": f"/org/{org_id}/group/{quote(group_id, safe='')}",
            "pathParameters": {
                "orgId": org_id,
                "group_id": quote(group_id, safe='')
            },
            "httpMethod": "GET"
        }
        logger.info(f"get_group_for_org request: {org_id} and {group_id}")
        group_details_lambda_response = self.lambda_client.invoke(
            FunctionName=GET_GROUP_FOR_ORG_API_ARN,
            InvocationType='RequestResponse',
            Payload=json.dumps(group_details_event)
        )
        group_details_response = json.loads(group_details_lambda_response.get('Payload').read())
        logger.info(f"get_group_for_org response: {group_details_response}")
        if group_details_response["statusCode"] != 200:
            raise Exception(f"Failed to fetch group details for org_id:{org_id} "
                            f"group_id {group_id}")

        group_details_response_body = json.loads(group_details_response["body"])
        groups = group_details_response_body["data"]["groups"]
        if len(groups) == 0:
            raise Exception(f"Failed to find group {group_id} for org_id: {org_id}")
        return groups[0]["payment"]["payment_address"]

    def calculate_amount_in_cogs(self, amount, currency):
        if currency == "USD":
            amount_in_cogs = round(amount * USD_TO_COGS_CONVERSION_FACTOR)
            return amount_in_cogs
        else:
            raise Exception("Currency %s not supported.", currency)

    def execute_order(self, username, payload_dict):
        """
            Execute Order
                Step 1  Execute Payment
                Step 2  Get Receipient Address
                Step 3  Process Order
                Step 4  Update Transaction History
        """
        order_id = payload_dict["order_id"]
        payment_id = payload_dict["payment_id"]
        order = self.get_order_details_by_order_id(order_id, username)
        payment = None
        for payment_item in order["payments"]:
            if payment_item["payment_id"] == payment_id:
                payment = payment_item
                break

        if payment is None:
            raise Exception(f"Failed to fetch order details for order_id {order_id} \n"
                            f"payment_id {payment_id} \n"
                            f"username{username}")

        order_type = order["item_details"]["order_type"]
        item_details = order["item_details"]
        payment_method = payment["payment_details"]["payment_method"]
        paid_payment_details = payload_dict["payment_details"]
        price = payment["price"]
        status = Status.PAYMENT_EXECUTION_FAILED.value
        self.manage_execute_payment(
            username=username, order_id=order_id, payment_id=payment_id,
            payment_details=paid_payment_details, payment_method=payment_method
        )

        status = Status.PAYMENT_EXECUTED.value
        try:
            status = Status.ORDER_PROCESSING_FAILED.value
            amount_in_cogs = self.calculate_amount_in_cogs(amount=price["amount"], currency=price["currency"])
            if amount_in_cogs < 1:
                raise Exception("Amount in cogs should be greater than equal to 1")
            processed_order_data = self.manage_process_order(
                username=username,
                order_id=order_id, order_type=order_type,
                amount=price["amount"],
                currency=price["currency"], order_data=item_details,
                amount_in_cogs=amount_in_cogs
            )
            status = Status.ORDER_PROCESSED.value
            obj_transaction_history = TransactionHistory(
                username=username, order_id=order_id, order_type=order_type,
                status=status, payment_id=payment_id,
                payment_method=payment_method,
                raw_payment_data=json.dumps(paid_payment_details)
            )
            self.obj_transaction_history_dao.insert_transaction_history(obj_transaction_history=obj_transaction_history)
            processed_order_data["price"] = price
            processed_order_data["item_details"] = item_details
            return processed_order_data

        except Exception as e:
            obj_transaction_history = TransactionHistory(
                username=username, order_id=order_id,
                order_type=order_type, status=status
            )
            self.obj_transaction_history_dao.insert_transaction_history(obj_transaction_history=obj_transaction_history)
            print(repr(e))
            raise e

    def get_order_details_by_order_id(self, order_id, username):
        order_details_event = {
            "path": f"order/{order_id}",
            "pathParameters": {"order_id": order_id},
            "httpMethod": "GET"
        }

        logger.info(f"Requesting order details for order_id {order_id}")
        response = self.lambda_client.invoke(
            FunctionName=ORDER_DETAILS_ORDER_ID_ARN,
            InvocationType='RequestResponse',
            Payload=json.dumps(order_details_event)
        )
        order_details_response = json.loads(response.get('Payload').read())
        if order_details_response["statusCode"] != 200:
            raise Exception(f"Failed to fetch order details for order_id {order_id} username{username}")

        order_details_data = json.loads(order_details_response["body"])
        if order_details_data["username"] != username:
            raise Exception(f"Failed to fetch order details for order_id {order_id} username{username}")
        return order_details_data

    def manage_initiate_payment(self, username, order_id, price, payment_method):
        initiate_payment_event = {
            "pathParameters": {"order_id": order_id},
            "httpMethod": "POST",
            "body": json.dumps({"price": price, "payment_method": payment_method})
        }
        response = self.lambda_client.invoke(
            FunctionName=INITIATE_PAYMENT_SERVICE_ARN,
            InvocationType='RequestResponse',
            Payload=json.dumps(initiate_payment_event)
        )
        initiate_payment_data = json.loads(response.get('Payload').read())
        if initiate_payment_data["statusCode"] == 201:
            return json.loads(initiate_payment_data["body"])
        else:
            logger.error("Error initiating payment for user %s", username)
            raise PaymentInitiateFailed

    def manage_create_order(self, username, item_details, price):
        create_order_event = {
            "path": "/order/create",
            "httpMethod": "POST",
            "body": json.dumps({"price": price, "item_details": item_details, "username": username})
        }
        create_order_service_response = self.boto_client.invoke_lambda(
            lambda_function_arn=CREATE_ORDER_SERVICE_ARN,
            invocation_type='RequestResponse',
            payload=json.dumps(create_order_event)
        )
        logger.info(f"create_order_service_response: {create_order_service_response}")

        if create_order_service_response["statusCode"] == 201:
            return json.loads(create_order_service_response["body"])
        else:
            raise Exception(f"Error creating order for user {username}")

    def manage_execute_payment(self, username, order_id, payment_id, payment_details, payment_method):
        execute_payment_event = {
            "pathParameters": {"order_id": order_id, "payment_id": payment_id},
            "body": json.dumps({"payment_method": payment_method, "payment_details": payment_details})
        }
        response = self.lambda_client.invoke(
            FunctionName=EXECUTE_PAYMENT_SERVICE_ARN,
            InvocationType='RequestResponse',
            Payload=json.dumps(execute_payment_event)
        )
        payment_executed = json.loads(response.get('Payload').read())
        if payment_executed["statusCode"] == 201:
            return payment_executed
        else:
            raise Exception(f"Error executing payment for username {username} against order_id {order_id}")

    def manage_process_order(self, username, order_id, order_type, amount, currency, order_data, amount_in_cogs):
        logger.info(f"Order Data {order_data}")
        group_id = order_data["group_id"]
        org_id = order_data["org_id"]
        recipient = order_data["recipient"]
        channel_id = order_data["channel_id"]
        sender = order_data["wallet_address"]
        if order_type == OrderType.CREATE_WALLET_AND_CHANNEL.value:
            wallet_create_payload = {
                "path": "/wallet",
                "body": json.dumps({"username": username}),
                "httpMethod": "POST"
            }
            wallet_create_lambda_response = self.lambda_client.invoke(
                FunctionName=WALLETS_SERVICE_ARN,
                InvocationType='RequestResponse',
                Payload=json.dumps(wallet_create_payload)
            )
            wallet_create_response = json.loads(wallet_create_lambda_response.get("Payload").read())
            if wallet_create_response["statusCode"] != 200:
                raise Exception("Failed to create wallet")
            wallet_create_response_body = json.loads(wallet_create_response["body"])
            wallet_details = wallet_create_response_body["data"]

            try:
                current_block_no = self.obj_blockchain_util.get_current_block_no()
                # 1 block no is mined in 15 sec on average, setting expiration as 10 years
                expiration = current_block_no + (10 * 365 * 24 * 60 * 4)
                message_nonce = current_block_no
                self.EXECUTOR_WALLET_ADDRESS = self.boto_client.get_ssm_parameter(EXECUTOR_ADDRESS)
                group_id_in_hex = "0x" + base64.b64decode(group_id).hex()
                signature_details = self.generate_signature_for_open_channel_for_third_party(
                    recipient=recipient, group_id=group_id_in_hex,
                    amount_in_cogs=amount_in_cogs, expiration=expiration,
                    message_nonce=message_nonce, sender_private_key=wallet_details["private_key"],
                    executor_wallet_address=self.EXECUTOR_WALLET_ADDRESS
                )

                logger.info(f"Signature Details {signature_details}")
                open_channel_body = {
                    'order_id': order_id,
                    'sender': wallet_details["address"],
                    'signature': signature_details["signature"],
                    'r': signature_details["r"],
                    's': signature_details["s"],
                    'v': signature_details["v"],
                    'group_id': group_id,
                    'org_id': org_id,
                    'amount': amount,
                    'currency': currency,
                    'recipient': recipient,
                    'current_block_no': current_block_no,
                    'amount_in_cogs': amount_in_cogs
                }
                channel_details = self.wallet_service.create_channel(open_channel_body=open_channel_body)
                channel_details.update(wallet_details)
                return channel_details
            except Exception as e:
                logger.error("Failed to create channel")
                logger.error(repr(e))
                response = {
                    "transaction_hash": "",
                    "signature": "",
                    "amount_in_cogs": 0,
                    "price": {
                        "amount": amount,
                        "currency": currency
                    },
                    "item_details": order_data
                }
                response.update(wallet_details)
                raise ChannelCreationFailed("Failed to create channel", wallet_details=response)

        elif order_type == OrderType.CREATE_CHANNEL.value:
            try:
                logger.info(f"Order Data {order_data}")
                signature = order_data["signature"]
                v, r, s = Web3.toInt(hexstr="0x" + signature[-2:]), signature[:66], "0x" + signature[66:130]
                open_channel_body = {
                    'order_id': order_id, 'sender': order_data["wallet_address"],
                    'signature': order_data["signature"], 'r': r, 's': s, 'v': v,
                    'group_id': group_id, 'org_id': org_id, 'amount': amount, 'currency': currency,
                    'recipient': recipient, 'current_block_no': order_data["current_block_number"],
                    'amount_in_cogs': amount_in_cogs
                }
                channel_details = self.wallet_service.create_channel(open_channel_body=open_channel_body)
                logger.info(f"channel_details: {channel_details}")
                return channel_details
            except Exception as e:
                logger.error("Failed to create channel")
                print(repr(e))
                raise ChannelCreationFailed("Failed to create channel", wallet_details=order_data)

        elif order_type == OrderType.FUND_CHANNEL.value:

            try:
                fund_channel_body = {
                    'order_id': order_id,
                    'group_id': group_id,
                    'org_id': org_id,
                    'amount': amount,
                    'channel_id': channel_id,
                    'currency': currency,
                    'recipient': recipient,
                    'sender': sender,
                    'amount_in_cogs': amount_in_cogs
                }
                fund_channel_payload = {
                    "path": "/wallet/channel/deposit",
                    "body": json.dumps(fund_channel_body),
                    "httpMethod": "POST"
                }

                fund_channel_lambda_response = self.lambda_client.invoke(
                    FunctionName=WALLETS_SERVICE_ARN,
                    InvocationType='RequestResponse',
                    Payload=json.dumps(fund_channel_payload)
                )

                fund_channel_response = json.loads(fund_channel_lambda_response.get("Payload").read())
                if fund_channel_response["statusCode"] != 200:
                    raise Exception(f"Failed to add funds in channel for {fund_channel_body}")

                fund_channel_response_body = json.loads(fund_channel_response["body"])
                fund_channel_transaction_details = fund_channel_response_body["data"]
                return fund_channel_transaction_details
            except Exception as e:
                logger.error("Failed to fund channel")
                logger.error(repr(e))
                raise FundChannelFailed()
        else:
            raise Exception("Order type is not valid.")

    def get_order_details_by_username(self, username):
        order_details_event = {
            "path": f"/order",
            "queryStringParameters": {"username": username},
            "httpMethod": "GET"
        }

        logger.info(f"Requesting order details for username {username}")
        order_details_response = self.boto_client.invoke_lambda(
            lambda_function_arn=ORDER_DETAILS_BY_USERNAME_ARN,
            invocation_type='RequestResponse',
            payload=json.dumps(order_details_event)
        )
        if order_details_response["statusCode"] != 200:
            raise Exception(f"Failed to fetch order details for username{username}")

        org_id_name_mapping = self.get_organizations_from_contract()

        order_details_response_body = json.loads(order_details_response["body"])
        orders = order_details_response_body["orders"]

        for order in orders:
            order_id = order["order_id"]
            order["wallet_type"] = "GENERAL"
            if "org_id" in order["item_details"]:
                org_id = order["item_details"]["org_id"]
                if org_id in org_id_name_mapping:
                    order["item_details"]["organization_name"] = org_id_name_mapping[org_id]

            transaction_details_event = {
                "path": f"/wallet/channel/transactions",
                "queryStringParameters": {"order_id": order_id},
                "httpMethod": "GET"
            }
            transaction_details_lambda_response = self.lambda_client.invoke(
                FunctionName=WALLETS_SERVICE_ARN,
                InvocationType='RequestResponse',
                Payload=json.dumps(transaction_details_event)
            )
            transaction_details_response = json.loads(transaction_details_lambda_response.get('Payload').read())
            if transaction_details_response["statusCode"] != 200:
                raise Exception(f"Failed to fetch transaction details for username{order_id}")
            transaction_details_response_body = json.loads(transaction_details_response["body"])
            order["wallet_transactions"] = transaction_details_response_body["data"]["transactions"]
            order_status = TransactionStatus.SUCCESS
            for payment in order["payments"]:
                if payment["payment_status"] != TransactionStatus.SUCCESS:
                    order_status = payment["payment_status"]
                    break

            for wallet_transaction in order["wallet_transactions"]:
                if wallet_transaction["status"] != TransactionStatus.SUCCESS:
                    order_status = wallet_transaction["status"]
                    break

            order["order_status"] = order_status
        return {"orders": orders}

    def get_organizations_from_contract(self):
        org_details_event = {
            "path": f"/org",
            "httpMethod": "GET"
        }
        org_details_response = self.boto_client.invoke_lambda(
            lambda_function_arn=GET_ALL_ORG_API_ARN,
            invocation_type='RequestResponse',
            payload=json.dumps(org_details_event)
        )
        if org_details_response["statusCode"] != 200:
            raise Exception("Failed to get org details")

        org_details = json.loads(org_details_response["body"])["data"]
        org_id_name_mapping = {}
        for org in org_details:
            org_id_name_mapping[org["org_id"]] = org["org_name"]

        return org_id_name_mapping

    def generate_signature_for_open_channel_for_third_party(self, recipient, group_id, amount_in_cogs, expiration,
                                                            message_nonce, sender_private_key, executor_wallet_address):

        signature_for_open_channel_for_third_party_body = {
            'recipient': recipient,
            'group_id': group_id,
            'amount_in_cogs': amount_in_cogs,
            'expiration': expiration,
            'message_nonce': message_nonce,
            'signer_key': sender_private_key,
            'executor_wallet_address': executor_wallet_address
        }

        signature_for_open_channel_for_third_party_payload = {
            "path": "/signer/open-channel-for-third-party",
            "body": json.dumps(signature_for_open_channel_for_third_party_body),
            "httpMethod": "POST"
        }

        signature_for_open_channel_for_third_party_response = self.lambda_client.invoke(
            FunctionName=SIGNER_SERVICE_ARN,
            InvocationType='RequestResponse',
            Payload=json.dumps(signature_for_open_channel_for_third_party_payload)
        )

        signature_response = json.loads(signature_for_open_channel_for_third_party_response.get("Payload").read())
        if signature_response["statusCode"] != 200:
            raise Exception(f"Failed to create signature for {signature_for_open_channel_for_third_party_body}")
        signature_details = json.loads(signature_response["body"])
        return signature_details["data"]

    def cancel_order(self):
        logger.info("Start of UpdateTransactionStatus::manage_update_canceled_order_in_txn_history")
        list_of_order_id_for_expired_transaction = self.obj_transaction_history_dao.get_order_id_for_expired_transaction()
        logger.info(f"List of order_id to be updated with ORDER CANCELED: {list_of_order_id_for_expired_transaction}")
        update_transaction_status = self.obj_transaction_history_dao.update_transaction_status(
            list_of_order_id=list_of_order_id_for_expired_transaction, status=OrderStatus.ORDER_CANCELED.value)
        return update_transaction_status

    def cancel_order_for_given_order_id(self, order_id):
        logger.info("UpdateTransactionStatus::cancel_order_for_given_order_id: %s", order_id)
        transaction_data_dict = self.obj_transaction_history_dao.get_transaction_details_for_given_order_id(
            order_id=order_id)
        if transaction_data_dict["status"] == OrderStatus.ORDER_CANCELED.value:
            return f"Order with order_id {order_id} is already canceled."
        elif transaction_data_dict["status"] in [OrderStatus.PAYMENT_INITIATED.value,
                                                 OrderStatus.PAYMENT_INITIATION_FAILED.value,
                                                 OrderStatus.PAYMENT_EXECUTION_FAILED]:
            self.obj_transaction_history_dao.update_transaction_status(list_of_order_id=[order_id],
                                                                       status=OrderStatus.ORDER_CANCELED.value)
            return f"Order with order_id {order_id} is canceled successfully."
        else:
            return f"Unable to cancel order with order_id {order_id}"

    def currency_to_token(self, amount, currency):
        amount_in_cogs = self.calculate_amount_in_cogs(amount=decimal.Decimal(amount), currency=currency)
        conversion_data = {"base": currency, "amount": amount, "amount_in_cogs": str(amount_in_cogs),
                           "amount_in_agi": str(self.utils.cogs_to_agi(cogs=amount_in_cogs)),
                           f"{currency}/cogs": str(USD_TO_COGS_CONVERSION_FACTOR), "agi/cogs": str(COGS_TO_AGI)}
        logger.debug(f"currency_to_token::conversion_data {conversion_data}")
        return conversion_data
Ejemplo n.º 43
0
 def get_divi_earn(self):
     return Utils.read_data(self.divi_file)
Ejemplo n.º 44
0
from common.blockchain_util import BlockChainUtil
from common.utils import Utils
from rfai.config import NETWORK
from rfai.dao.foundation_member_data_access_object import FoundationMemberDAO
from rfai.dao.request_data_access_object import RequestDAO
from rfai.dao.solution_data_access_object import SolutionDAO
from rfai.dao.stake_data_access_object import StakeDAO
from rfai.dao.vote_data_access_object import VoteDAO
from rfai.dao.rfai_request_repository import RFAIRequestRepository
from rfai.rfai_status import RFAIStatusCodes
import json
from common.logger import get_logger

obj_utils = Utils()
obj_blockchain_utils = BlockChainUtil(provider_type="HTTP_PROVIDER", provider=NETWORK["http_provider"])
logger = get_logger(__name__)


class RFAIService:
    def __init__(self, repo):
        self.request_dao = RequestDAO(repo=repo)
        self.vote_dao = VoteDAO(repo=repo)
        self.solution_dao = SolutionDAO(repo=repo)
        self.stake_dao = StakeDAO(repo=repo)
        self.foundation_member_dao = FoundationMemberDAO(repo=repo)
        self.rfai_request_dao = RFAIRequestRepository(repo=repo)

    def _format_filter_params(self, query_parameters):
        filter_params = {}
        # if "requester" in query_parameters.keys():
        #     filter_params["requester"] = query_parameters["requester"]
Ejemplo n.º 45
0
from common.exception_handler import exception_handler
from common.logger import get_logger
from common.repository import Repository
from common.utils import Utils, validate_dict, generate_lambda_response, make_response_body
from wallets.config import NETWORK_ID, NETWORKS, SLACK_HOOK
from wallets.domain.models.channel_transaction_history import ChannelTransactionHistory
from wallets.error import Error
from wallets.exceptions import EXCEPTIONS
from wallets.infrastructure.repositories.channel_repository import ChannelRepository
from wallets.service.manage_create_channel_event import ManageCreateChannelEvent
from wallets.service.wallet_service import WalletService

NETWORKS_NAME = dict(
    (NETWORKS[netId]['name'], netId) for netId in NETWORKS.keys())
repo = Repository(net_id=NETWORK_ID, NETWORKS=NETWORKS)
utils = Utils()
logger = get_logger(__name__)
wallet_service = WalletService(repo=repo)


def create_channel(event, context):
    logger.info("Received request to initiate order")
    try:
        payload = json.loads(event["body"])
        required_keys = [
            "order_id", "sender", "signature", "r", "s", "v",
            "current_block_no", "group_id", "org_id", "amount", "currency",
            "recipient", "amount_in_cogs"
        ]
        if validate_dict(payload, required_keys):
            logger.info(f"Payload for create channel: {payload}")
from common.constant import StatusDescription, ErrorDescription
from common.logger import get_logger
from common.repository import Repository
from common.utils import Utils, generate_lambda_response, extract_payload, validate_dict, format_error_message
from wallets.config import NETWORKS, NETWORK_ID, WALLET_TYPES_ALLOWED
from wallets.config import SLACK_HOOK
from wallets.constant import REQUIRED_KEYS_FOR_LAMBDA_EVENT
from wallets.service.wallet_service import WalletService
from wallets.wallet import Wallet

NETWORKS_NAME = dict(
    (NETWORKS[netId]['name'], netId) for netId in NETWORKS.keys())
db = dict((netId, Repository(net_id=netId, NETWORKS=NETWORKS))
          for netId in NETWORKS.keys())
util = Utils()
logger = get_logger(__name__)


class WalletStatus(Enum):
    ACTIVE = 1


def route_path(path, method, payload_dict, path_parameters):
    wallet_manager = WalletService(repo=db[NETWORK_ID])
    path_exist = True
    response_data = None

    if "/wallet" == path and method == "POST":
        response_data = wallet_manager.create_and_register_wallet(
            username=payload_dict["username"])
Ejemplo n.º 47
0
 def __init__(self, obj_repo, net_id):
     self.repo = obj_repo
     self.net_id = net_id
     self.lambda_client = boto3.client('lambda')
     self.obj_utils = Utils()
        def wrapper(*args, **kwargs):
            handler_name = decorator_kwargs.get("handler_name", func.__name__)
            path = kwargs.get("event", {}).get("path", None)
            path_parameters = kwargs.get("event", {}).get("pathParameters", {})
            query_string_parameters = kwargs.get("event", {}).get(
                "queryStringParameters", {})
            body = kwargs.get("event", {}).get("body", "{}")

            error_message = f"Error Reported! \n" \
                            f"network_id: {NETWORK_ID}\n" \
                            f"path: {path}, \n" \
                            f"handler: {handler_name} \n" \
                            f"pathParameters: {path_parameters} \n" \
                            f"queryStringParameters: {query_string_parameters} \n" \
                            f"body: {body} \n" \
                            f"x-ray-trace-id: None \n" \
                            f"error_description: \n"

            try:
                return func(*args, **kwargs)
            except EXCEPTIONS as e:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                exc_tb_lines = traceback.format_tb(exc_tb)
                error_message = error_message + e.error_message + "\n"
                logger.exception(error_message)

                slack_message = error_message
                for exc_lines in exc_tb_lines:
                    slack_message = slack_message + exc_lines
                slack_message = f"```{slack_message}```"
                Utils().report_slack(type=0,
                                     slack_message=slack_message,
                                     slack_config=SLACK_HOOK)

                return generate_lambda_response(
                    StatusCode.INTERNAL_SERVER_ERROR, {
                        "status": "failed",
                        "data": "",
                        "error": {
                            "message": e.error_message,
                            "details": e.error_details
                        }
                    },
                    cors_enabled=True)
            except Exception as e:
                exc_type, exc_obj, exc_tb = sys.exc_info()
                exc_tb_lines = traceback.format_tb(exc_tb)
                logger.exception(error_message)

                slack_message = error_message
                for exc_lines in exc_tb_lines:
                    slack_message = slack_message + exc_lines
                slack_message = f"```{slack_message}```"
                Utils().report_slack(type=0,
                                     slack_message=slack_message,
                                     slack_config=SLACK_HOOK)

                return generate_lambda_response(
                    StatusCode.INTERNAL_SERVER_ERROR, {
                        "status": "failed",
                        "data": "",
                        "error": {
                            "code": 0,
                            "message": repr(e),
                            "details": {}
                        }
                    },
                    cors_enabled=True)
Ejemplo n.º 49
0
	def __init__(self,x,y,item_name):
		pygame.sprite.Sprite.__init__(self,self.containers)
		self.item_name = item_name
		self.x = x
		self.y = y
		self.state = Constant.ITEM_STATE_LIVE
		self.frame_index = 0
		self.frame_count = 0
		self.timer_die = 0
		self.timer_live = 0
		self.fall = True
		if self.item_name == Constant.MONEY_ITEM :
			self.style = Constant.ADD
			self.feature = Constant.MONEY
			self.num_frame = 7
			image = Utils.my_load_image("vatpham","money.png")
			self.image_frame = Utils.load_frame(image,0,0,40,40,0,self.num_frame)
		elif self.item_name == Constant.BUMERANGE_TREE_ITEM :
			print 28
			self.style = Constant.ADD
			self.feature = Constant.BUMERANGE 
			self.num_frame = 1
			image = Utils.my_load_image("vatpham","bumerange.png")
			self.image_frame = Utils.load_frame(image,0,0,89,70,0,self.num_frame)
			print len(self.image_frame)
		elif self.item_name == Constant.MAGIC_BOX_ITEM :
			self.style = Constant.ADD
			self.feature = Constant.LIFE
			self.num_frame = 1
			image = Utils.my_load_image("vatpham","magic_box.png")
			self.image_frame = Utils.load_frame(image,0,0,69,69,0,self.num_frame)
		elif self.item_name == Constant.MONSTER_ITEM :
			self.style = Constant.SUBTRACT
			self.feature = Constant.LIFE
			self.num_frame = 1
			image = Utils.my_load_image("vatpham","monster.png")
			self.image_frame = Utils.load_frame(image,0,0,89,89,0,self.num_frame)
		elif self.item_name == Constant.BERRY_ITEM :
			self.style = Constant.ADD
			self.feature = Constant.ENERGY
			self.num_frame = 1
			image = Utils.my_load_image("vatpham","berry.png")
			self.image_frame = Utils.load_frame(image,0,0,59,59,0,self.num_frame)
		print len(self.image_frame)
		self.image = self.image_frame[self.frame_index]
		self.rect = self.image.get_rect()
		self.rect.move_ip(x,y)
		self.max_right = x + self.move_length
		self.max_left = x - self.move_length

		self.sound = Utils.load_sound('Ding.ogg')

		self.pos_creep_screen = 0