Browse Source

add event api, adjust follow api and collection api

CJYen 3 years ago
parent
commit
9e448f66d3
2 changed files with 57 additions and 99 deletions
  1. 54 99
      main.py
  2. 3 0
      models.py

+ 54 - 99
main.py

@@ -46,68 +46,16 @@ def handle_follow(event):
     # db connect and search
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
     table = db['users']
-    table2 = db['nft']
     result1 = table.find_one(userid=real_user_id)
-    result2 = table2.find_one(userid=real_user_id)
 
     # 都存在db的話
-    if result1 and result2:
-        db.close()
-        line_bot_api.reply_message(
-            event.reply_token,
-            TextSendMessage(text='很高興再見到您!'))
-
-    # 只存在user,新增nft給他
-    elif result1 and not result2:
-        # prepare nft for new follower
-        result3 = table2.find_one(userid=None) or table2.find_one(userid='')
-        result3['userid'] = real_user_id
-        table2.update(dict(result3), ['id'])
-
-        db.close()
-
-        line_bot_api.reply_message(
-            event.reply_token,
-            TextSendMessage(text='很高興再見到您!'))
-
-    # 只存在nft,新加到user
-    elif result2 and not result1:
-        # create user account api
-        url = 'https://nft-api-staging.joyso.io/api/v1/accounts'
-        headers = {'Authorization': 'Basic bmZ0OmMxOTEzOWMzYjM3YjdjZWU3ZmY3OTFiZGU3NzdjZWNl'}
-
-        # setup for temp use (unique id)
-        rand_num = str(randrange(99999))
-        user_id = event.source.user_id + rand_num
-        data = 'uid=' + user_id
-        r = requests.post(url=url, headers=headers, data=data)
-
-        # extract the account address
-        dict_str = json.loads(r.text)
-        user_account = dict_str['account']
-        user_address = user_account['address']
-
-        # generate qr code from user id
-        qr = qrcode.QRCode(
-            version=1,
-            box_size=10,
-            border=5)
-        qr.add_data(user_address)
-        qr.make(fit=True)
-        img_qr = qr.make_image(fill='black', back_color='white')
-        filename = "/var/www/ArkCard-Linebot/ArkCard-web/qrcode/" + real_user_id + '.png'
-        img_save = img_qr.save(filename)
-
-        # add to db
-        data = dict(userid=real_user_id, useraddress=user_address)
-        table.insert(data)
-
+    if result1:
         db.close()
         line_bot_api.reply_message(
             event.reply_token,
             TextSendMessage(text='很高興再見到您!'))
 
-    # 都不存在,兩種都新建
+    # 建立全新使用者
     else:
         # create user account api
         url = 'https://nft-api-staging.joyso.io/api/v1/accounts'
@@ -139,16 +87,12 @@ def handle_follow(event):
         data = dict(userid=real_user_id, useraddress=user_address)
         table.insert(data)
 
-        # prepare nft for new follower
-        result3 = table2.find_one(userid=None) or table2.find_one(userid='')
-        result3['userid'] = real_user_id
-        table2.update(dict(result3), ['id'])
-
         db.close()
 
         line_bot_api.reply_message(
             event.reply_token,
             TextSendMessage(text='歡迎加入好友'))
+    db.close()
 
 # message handler
 @handler.add(MessageEvent, message=TextMessage)
@@ -228,20 +172,40 @@ def collection(userid):
     # db connect
     db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
     table2 = db['nft']
+    table3 = db['nftdrops']
 
-    if not table2.find_one(userid=userid):
+    nft = {}
+    nft1 = {}
+    i = 0
+    if table3.find_one(userid=userid) and table2.find_one(userid=userid):
+        results1 = table3.find_one(userid=userid)
+        results2 = table2.find(userid=userid)
+        nft[0] = results1
+        for row in results2:
+            nft1[i] = row
+            i += 1
+        nft[1] = nft1
+        return nft
         db.close()
-        return "您尚未擁有NFT商品,歡迎前往NFT商店購買!"
-    else:
-        xname = userid
-        sql = 'SELECT a.* FROM nft a INNER JOIN (SELECT userid FROM users WHERE userid="' + xname + '") b ON b.userid = a.userid'
-        result = db.query(sql)
-        rows = {}
-        i = 0
-        for row in result:
-            rows[i] = row
+
+    elif table3.find_one(userid=userid) and not table2.find_one(userid=userid):
+        results1 = table3.find_one(userid=userid)
+        nft[0] = results1
+        return nft
+        db.close()
+
+    elif table2.find_one(userid=userid) and not table3.find_one(userid=userid):
+        results2 = table2.find(userid=userid)
+        for row in results2:
+            nft1[i] = row
             i += 1
-        return rows
+        nft[1] = nft1
+        return nft
+        db.close()
+
+    else:
+        db.close()
+        print("error: user don't have any nft")
     db.close()
 
 # receive handler
@@ -301,22 +265,6 @@ def shop(userid):
     return rows
     db.close()
 
-# market
-@app.get("/market")
-def market():
-    # db connect
-    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
-
-    sql = 'SELECT * FROM arkcard.nft WHERE userid IS NULL OR userid="" LIMIT 10'
-    result = db.query(sql)
-    rows = {}
-    i = 0
-    for row in result:
-        rows[i] = row
-        i += 1
-    return rows
-    db.close()
-
 @app.post("/buy")
 async def buy(userModel : models.BuyNft):
     # db connect
@@ -338,19 +286,26 @@ async def buy(userModel : models.BuyNft):
         db.close()
     return "您已購買成功!"
 
-# @app.post("/callevent")
-# async def callevent(userModel: models.callBack):
-#     """
-#     事件會用application/json和POST方式打到指定位址, 內容基本包含
-#     {
-#       "type": "xxx", // 事件類型, 字串
-#       "data": {} // 事件內容資料
-#     }
-#     """
-#     str1 =  userModel.type
-#     dict1 = userModel.data
-#     result = str1, dict1
-#     return result
+@app.post("/event")
+async def nftdrops(userModel : models.NftDrops):
+    # db connect
+    db = dataset.connect('mysql://choozmo:pAssw0rd@db.ptt.cx:3306/arkcard?charset=utf8mb4')
+    table3 = db['nftdrops']
+
+    # input對應
+    userid = userModel.userid
+
+    # 如果userid不在db, 寫入到一個空值nft
+    if not table3.find_one(userid=userid):
+        sql = 'UPDATE arkcard.nftdrops SET userid="' + userid + '" WHERE userid IS NULL OR userid ="" LIMIT 1'
+        result = db.query(sql)
+        db.close()
+        return "「火」通行證已送出"
+    # 如果userid存在,回傳通知
+    else:
+        db.close()
+        return "您已收藏過「火」通行證"
+    db.close()
 
 if __name__ == '__main__':
     uvicorn.run("main:app", host="0.0.0.0", port=8228, reload=True,ssl_context=('/etc/letsencrypt/live/ark.cards/fullchain.pem', '/etc/letsencrypt/live/ark.cards/privkey.pem'))

+ 3 - 0
models.py

@@ -8,6 +8,9 @@ class BuyNft(BaseModel):
     nftid: int
     userid: str
 
+class NftDrops(BaseModel):
+    userid: str
+
 class callBack(BaseModel):
     type: str
     data: dict