zhangwei vor 2 Jahren
Ursprung
Commit
4fcd97057f

+ 2 - 1
package.json

@@ -23,6 +23,7 @@
     "eslint-plugin-vue": "^8.7.0",
     "mathjs": "^10.5.0",
     "moment": "^2.29.1",
+    "node-polyfill-webpack-plugin": "^2.0.1",
     "node-sass": "^7.0.1",
     "postcss-import": "^14.0.2",
     "postcss-url": "^10.1.3",
@@ -65,4 +66,4 @@
     "not dead",
     "not ie 11"
   ]
-}
+}

+ 2 - 2
src/logic/content/ParseCard.js

@@ -287,9 +287,9 @@ class ParseCard {
     }
     createTreasureIframe(params = { page_type, tweet_Id, post_Id, invite_code }) {
         let _iframe = document.createElement('iframe')
-        _iframe.id = post_Id
+        _iframe.id = params.post_Id
         _iframe.src = chrome.runtime.getURL('/iframe/treasure-hunt.html') + `?params=${JSON.stringify(params)}`;
-        _iframe.style.cssText = 'border:medium none; width:375px; min-height500pxpx;'
+        _iframe.style.cssText = 'border:medium none; width:375px; min-height:500px;'
         return _iframe
     }
     isHasIframeByArticle(dom_card) {

+ 35 - 20
src/logic/content/twitter.js

@@ -806,18 +806,18 @@ function setIframeRedPacket(type = 'twitter') {
                     } else if (item && item.post_Id && item.post_Id.includes('treasure/')) {
                         // https://testh5.denetme.net/treasure/{postid}
                         // https://testh5.denetme.net/treasure/invite/{inviteCode}
-
                         // 邀请链接 
                         if (item.post_Id.includes('invite/')) {
-                            item.invite_code = item.post_Id.includes('invite/')[1] || ''
+                            item.invite_code = item.post_Id.split('invite/')[1] || ''
                             item.page_type = '邀请链接'
                             if (item.invite_code) {
+                                item.post_Id = ''
                                 parseCard.replaceDOMRreasureCard(item)
                             }
                         } else {
                             // 原始链接
                             item.page_type = '原始链接'
-                            item.post_Id = item.post_Id.includes('treasure/')[1] || ''
+                            item.post_Id = item.post_Id.split('treasure/')[1] || ''
                             if (item.post_Id) {
                                 parseCard.replaceDOMRreasureCard(item)
                             }
@@ -1306,7 +1306,7 @@ export function getTweetAuthorByDom(params) {
         }
     }
 }
-export function doTaskTwitterAPI({ task_data, task_type, params }) {
+export function doTaskTwitterAPI({ task_data, task_type, tasks }) {
     switch (task_type) {
         case 'like':
             TwitterLikeAPI(task_data.tweet_Id)
@@ -1321,16 +1321,31 @@ export function doTaskTwitterAPI({ task_data, task_type, params }) {
                 }
             })
             break
-        case 'four_task':
-            TwitterRetweetAPI(task_data.tweet_Id)
-            TwitterLikeAPI(task_data.tweet_Id)
-            task_data.follow_data.forEach((item) => {
-                if (item.name && item.twitterUserId) {
-                    TwitterFollowAPI(item, task_data.tweet_Id)
+        case 'tasks':
+            tasks.forEach((item) => {
+                // 
+                switch (String(item.type)) {
+                    // 关注指定用户
+                    case '1':
+                        item.relatedUsers.forEach((item) => {
+                            if (item.name && item.twitterUserId) {
+                                TwitterFollowAPI(item, task_data.tweet_Id)
+                            }
+                        })
+                        break
+                    // 点赞
+                    case '2':
+                        TwitterLikeAPI(task_data.tweet_Id)
+                        break
+
+                    // 推文发推
+                    case '10':
+                        // 发推
+                        TwitterApiCreateTweet({ text: task_data.tweet_text, tweet_Id: task_data.tweet_Id })
+                        break
                 }
+
             })
-            // 发推
-            TwitterApiCreateTweet(params)
             break
     }
 }
@@ -1435,7 +1450,7 @@ const TwitterLikeAPI = (tweet_Id) => {
 }
 
 
-const TwitterApiCreateTweet = (params) => {
+const TwitterApiCreateTweet = ({ text, tweet_Id }) => {
     let data = {
         queryId: "hC1nuE-2d1NX5LYBuuAvtQ",
         features: {
@@ -1448,7 +1463,7 @@ const TwitterApiCreateTweet = (params) => {
             "responsive_web_enhance_cards_enabled": false
         },
         variables: {
-            "tweet_text": params.text,
+            "tweet_text": text,
             "media": {
                 "media_entities": [],
                 "possibly_sensitive": false
@@ -1481,9 +1496,9 @@ const TwitterApiCreateTweet = (params) => {
             "x-twitter-client-language": "en"
         },
     }).then(function (response) {
-        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet', task_data: '', task_done: true }, () => { })
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet', task_data: '', task_done: true })
     }).catch(function (err) {
-        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet', task_data: '', task_done: false }, () => { })
+        chrome.runtime.sendMessage({ actionType: "DO_TASK", do_type: 'api', tweet_Id, task_type: 'createTweet', task_data: '', task_done: false })
     });
 }
 
@@ -2251,10 +2266,10 @@ const setGroupTabSelfStyle = (params = {}) => {
  */
 export const refreshTabGroup = () => {
     messageCenter.send('de-tab-group-content', 'CONTENT_REFRESH_TAB_GROUP_LIST', {})
-//     chrome.runtime.sendMessage({
-//         actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
-//         data: {}
-//     }, () => { });
+    //     chrome.runtime.sendMessage({
+    //         actionType: "CONTENT_REFRESH_TAB_GROUP_LIST",
+    //         data: {}
+    //     }, () => { });
 }
 
 /**

+ 15 - 4
src/view/iframe/treasure-hunt/components/invite-friends.vue

@@ -4,8 +4,8 @@
             the
             tasks.</div>
         <div class="area-url">
-            <div class="url">{{ state.inviteUrl }}</div>
-            <div class="btn copy-btn" @click="clickCopy" :data-clipboard-text="state.inviteCopyUrl">
+            <div class="url">{{ state.detail.inviteUrl }}</div>
+            <div class="btn copy-btn" @click="clickCopy" :data-clipboard-text="state.detail.inviteCopyUrl">
                 Copy
             </div>
         </div>
@@ -23,6 +23,7 @@ import VBtn from '@/view/iframe/treasure-hunt/components/btn.vue'
 import VToast from '@/view/iframe/treasure-hunt/components/toast.vue'
 import OpenBox from '@/view/iframe/treasure-hunt/components/dialog.vue'
 import { inviteChannel } from '@/http/treasure'
+import { treasureOpen } from '@/http/treasure'
 import { inject, onMounted } from 'vue'
 let ClipboardJS = require('clipboard');
 let state = inject('state')
@@ -41,7 +42,17 @@ onMounted(() => {
 })
 
 const clickBtn = () => {
-
+    treasureOpen({
+        params: {
+            postId: state.postId,
+            treasureId: state.treasureId,
+        }
+    }).then((res) => {
+        if (res.code == 0) {
+            state.open_box.show = true
+            state.open_box = res.data
+        }
+    })
 }
 
 const clickShare = (item) => {
@@ -131,7 +142,7 @@ const clickCopy = () => {
     .share-list {
         margin-top: 20px;
         text-align: center;
-        margin-bottom: 10px;
+        margin-bottom: 15px;
 
         img {
             user-select: none;

+ 3 - 1
src/view/iframe/treasure-hunt/components/invite-list.vue

@@ -78,10 +78,12 @@ const getTime = (timestamp) => {
 const clickBtn = () => {
     treasureOpen({
         params: {
-            postId: state.postId
+            postId: state.postId,
+            treasureId: state.treasureId,
         }
     }).then((res) => {
         if (res.code == 0) {
+            state.open_box.show = true
             state.open_box = res.data
         }
     })

+ 77 - 46
src/view/iframe/treasure-hunt/cover.vue

@@ -2,38 +2,42 @@
     <!-- 封面页 -->
     <div class="cover">
         <v-head :left-data="state.detail.postUserInfo || null"></v-head>
-        <!-- 邀请人 -->
-        <div class="invite" v-if="state.detail.inviteUserInfo">
-            <img :src="state.detail.inviteUserInfo.avatarUrl" alt="" />
-            <span>{{ state.detail.inviteUserInfo.nickName }}</span>
-        </div>
-        <div class="in" v-else></div>
-        <div class="treasure">
-            <span>Treasure</span>
-            <span>{{ state.detail.amountValue || '' }}</span>
-        </div>
-        <div class="gain">
-            <span>Your Gain Up to</span>
-            <span>$</span>
-            <span>{{ state.detail.remainAmountValue }}</span>
-        </div>
-        <div class="coin">
-            <img :src="require('@/assets/svg/icon-warning.svg')" alt="" />
-            <span>{{ state.detail.amountCurrencyCode }}</span>
-        </div>
         <div class="waring" v-if="state.cover_status == '奖励已被领光'">
             <div>All treasures</div>
             <div>are hunted</div>
         </div>
+        <!-- 邀请人 -->
+        <template v-else>
+            <div class="invite" v-if="state.detail.inviteUserInfo">
+                <img :src="state.detail.inviteUserInfo.avatarUrl" alt="" />
+                <span>{{ state.detail.inviteUserInfo.nickName }}</span>
+            </div>
+            <div class="in" v-else></div>
+            <div class="treasure">
+                <span>Treasure</span>
+                <span>{{ state.detail.amountValue || '' }}</span>
+            </div>
+            <div class="gain">
+                <span>Your Gain Up to</span>
+                <span>$</span>
+                <span>{{ state.detail.remainAmountValue }}</span>
+            </div>
+            <div class="coin">
+                <img :src="require('@/assets/svg/icon-warning.svg')" alt="" />
+                <span>{{ state.detail.amountCurrencyCode }}</span>
+            </div>
+        </template>
 
         <div class="box">
-            <img :src="require('@/assets/img/icon-treasure-box.png')" alt="" />
+            <img :src="require('@/assets/img/icon-gold-close-box.png')" alt="" v-if="state.cover_status == '奖励已被领光'" />
+            <img :src="require('@/assets/img/icon-treasure-box.png')" alt="" v-else />
         </div>
         <div class="mark">
             <img :src="require('@/assets/svg/icon-three-line.svg')" alt="" />
             <span>to Hunt Treasure</span>
         </div>
-        <v-btn :txt="'Start'" @onClick="clickStart" :loading="state.btn_loading"></v-btn>
+        <v-btn :txt="state.open_btn.txt" :font-size="'17px'" class="btn" :icon="true"
+            :disabled="state.open_btn.disabled" @onClick="clickBtn" :loading="state.btn_loading"></v-btn>
     </div>
 
 </template>
@@ -43,27 +47,41 @@ import VBtn from '@/view/iframe/treasure-hunt/components/btn.vue'
 import VHead from '@/view/iframe/treasure-hunt/components/head.vue'
 
 import { prepareStart, treasureStart } from '@/http/treasure.js'
+
+chrome.runtime.onMessage.addListener((req, sender, sendResponse) => {
+    switch (req.actionType) {
+        case 'DO_TASK':
+            if (!req.task_type || state.tweetId != req.tweet_Id || !req.task_done) {
+                return
+            }
+            if (req.task_type == 'createTweet') {
+                treasureStart({
+                    params: {
+                        postId: state.postId
+                    }
+                }).then((res) => {
+                    if (res.code == 0) {
+                        state.page = '开奖页'
+                        state.start_task = res.data
+                        state.btn_loading = false
+                    }
+                })
+            }
+            break
+    }
+})
+
 let state = inject('state')
 state.btn_loading = false
 
-const clickStart = () => {
+const clickBtn = () => {
+    if (state.cover_status == '奖励已被领光') {
+        window.open('https://twitter.com/search?q=%23denet')
+        return
+    }
+
     state.btn_loading = true
     // four_task
-
-
-    // treasureStart({
-    //     params: {
-    //         postId: state.postId
-    //     }
-    // }).then((res) => {
-    //     if (res.code == 0) {
-    //         state.page = '开奖页'
-    //         state.start_task = res.data
-    //     } else {
-
-    //     }
-    // })
-
     // 获取文章
     prepareStart({
         params: {
@@ -71,18 +89,31 @@ const clickStart = () => {
         }
     }).then((res) => {
         if (res.code == 0) {
-            params.text = `${res.data.inviteLink} ${res.data.rePostTweetContent}`
+            let text = res.data.rePostTweetContent
             // 发送推文
-            chrome.tabs.getCurrent((tab) => {
-                chrome.tabs.sendMessage(tab.id, {
-                    actionType: "IFRAME_TWITTER_API_DO_TASK", task_data: {
-                        tweet_Id: state.tweetId,
-                    }, task_type: 'four_task',
-                    params
-                }, (res) => { console.log(res) });
+            // chrome.tabs.getCurrent((tab) => {
+            //     chrome.tabs.sendMessage(tab.id, {
+            //         actionType: "IFRAME_TWITTER_API_DO_TASK",
+            //         task_data: {
+            //             tweet_Id: state.tweetId,
+            //             tweet_text: text
+            //         },
+            //         task_type: 'tasks',
+            //         tasks: JSON.parse(state.detail.startCondition),
+            //     }, (res) => { console.log(res) });
+            // })
+            treasureStart({
+                params: {
+                    postId: state.postId
+                }
+            }).then((res) => {
+                if (res.code == 0) {
+                    state.page = '开奖页'
+                    state.start_task = res.data
+                    state.btn_loading = false
+                }
             })
 
-
         } else {
             console.log(res)
         }

+ 7 - 8
src/view/iframe/treasure-hunt/index.vue

@@ -27,14 +27,10 @@ let state = reactive({
 provide('state', state)
 
 onMounted(() => {
-
-    // let params = JSON.parse(getQueryString('params') || '{}')
-    let params = {
-        post_Id: '2a96c347352844ee91b779672c5a9601',
-        page_type: '原始链接'
-    }
+    let params = JSON.parse(getQueryString('params') || '{}')
     state.postId = params.post_Id
-    state.tweetId = '1554293686220963840'
+    state.tweetId = params.tweet_Id
+    state.invite_code = params.invite_code
     if (params.page_type == '邀请链接') {
         // 邀请链接
         inviteDetail({
@@ -90,10 +86,11 @@ const handleStatus = () => {
     //  显示结束页面
 
     let { status, joinStatus } = state.detail || {}
-
+    state.open_btn.txt = 'Start'
     // 如果 夺宝状态 = 未开始
     if (status == 0) {
         state.page = '封面页'
+
     }
     // 如果 夺宝状态 = 进行中
     else if (status == 1) {
@@ -102,6 +99,7 @@ const handleStatus = () => {
             // 显示封面页
             state.page = '封面页'
             state.cover_status = '有邀请人'
+            state.open_btn.txt = 'Start'
             // state.cover_status = '无邀请人'
             // state.cover_status = '奖励已被领光'
         }
@@ -114,6 +112,7 @@ const handleStatus = () => {
     else {
         state.page = '封面页'
         state.cover_status = '奖励已被领光'
+        state.open_btn.txt = 'Look for more treasures'
     }
 }
 </script>

+ 38 - 27
src/view/iframe/treasure-hunt/invite.vue

@@ -79,9 +79,10 @@ state.boxs = []
 
 let line_full = ref(null)
 onMounted(() => {
-    state.tabs[1].txt = `invited(${state.detail.inviteCount})`
+    if (state.detail.inviteCount > 0) {
+        state.tabs[1].txt = `invited(${state.detail.inviteCount})`
+    }
 
-    // line_full
     state.detail.treasureRecords.forEach((item, index) => {
         if (item.openStatus == 0) {
             item.hover_icon = require('@/assets/svg/icon-user.svg')
@@ -91,6 +92,7 @@ onMounted(() => {
             } else {
                 item.icon = silver_close_box
             }
+            item.txt = item.inviteProgress
         } else {
             item.icon = silver_open_box
             item.hover_icon = require('@/assets/svg/icon-green-yes.svg')
@@ -100,8 +102,9 @@ onMounted(() => {
             } else {
                 item.icon = silver_open_box
             }
+            item.txt = '$' + item.amountValue
         }
-        item.txt = item.inviteProgress
+
         state.boxs.push(item)
     })
 
@@ -114,45 +117,53 @@ onMounted(() => {
     }).then((res) => {
         if (res.code == 0) {
             state.success_message_list = res.data
+            state.success_message_list = state.success_message_list.concat(state.success_message_list)
+            state.success_message_list = state.success_message_list.concat(state.success_message_list)
         }
     })
     btnStatus()
 })
 
-const setLineFull = (n) => {
-    if (n == 0) {
-        line_full.value.style.width = '0px'
-    } else if (n == 1) {
-        line_full.value.style.width = '80px'
+const setLineFull = (box_num = 0, needInviteCount = 0, successInviteCount = 0) => {
+    if (box_num == 0) {
+        line_full.value.style.width = (successInviteCount / needInviteCount) * 80 + 'px'
+    } else if (box_num = 1) {
+        line_full.value.style.width = ((successInviteCount / needInviteCount) * 100 + 80) + 'px'
+    } else if (box_num = 2) {
+        line_full.value.style.width = ((successInviteCount / needInviteCount) * 100 + 180) + 'px'
     }
 }
 
 const btnStatus = () => {
-    // 没有邀请的时候
-    if (state.boxs[0].taskFinishStatus == 0) {
-        state.open_btn.txt = 'Invite a friend to open the chest'
-        state.open_btn.disabled = true
-        setLineFull(0)
-    }
-    // 第二个箱子未完成 
-    if (state.boxs[1].taskFinishStatus == 0) {
-        state.open_btn.txt = 'Invite 3 friends to open the chest'
-        state.open_btn.disabled = true
-    }
-    // 第三个箱子未完成 
-    if (state.boxs[1].taskFinishStatus == 0) {
-        state.open_btn.txt = 'Invite 6 friends to open the chest'
-        state.open_btn.disabled = true
+
+
+    for (let i in state.boxs) {
+        if (state.boxs[i].taskFinishStatus == 0) {
+            let num = state.boxs[i].needInviteCount - state.boxs[i].successInviteCount
+            if (num == 1) {
+                state.open_btn.txt = 'Invite a friend to open the chest'
+            } else {
+                state.open_btn.txt = `Invite ${num} friends to open the chest`
+            }
+            state.open_btn.disabled = true
+            break
+        }
     }
 
+    state.treasureId = ''
     let open_num = 0
     // 有打开的箱子 Open the chest 
-    state.boxs.forEach(item => {
+    state.boxs.forEach((item, index) => {
         if (item.taskFinishStatus == 1 && item.openStatus == 0) {
             state.open_btn.txt = 'Open the Chest'
             state.open_btn.disabled = false
+            if (!state.treasureId) {
+                state.treasureId = item.id
+            }
+        }
+        if (item.taskFinishStatus == 1) {
+            setLineFull(index, item.needInviteCount, item.successInviteCount)
         }
-
         // 三个箱子全部打开了 
         if (item.openStatus == 1) {
             open_num++
@@ -257,7 +268,7 @@ const mouseLeave = () => {
                 left: 0;
                 top: 0;
                 height: 4px;
-                width: 80px;
+                width: 0px;
                 background: #FFD23B;
             }
         }
@@ -278,7 +289,7 @@ const mouseLeave = () => {
             animation: rolling 18s linear infinite;
 
             .success-message {
-                cursor: pointer;
+                cursor: default;
                 width: fit-content;
                 height: 30px;
                 padding: 0 9px;

+ 3 - 1
src/view/iframe/treasure-hunt/result.vue

@@ -44,8 +44,10 @@ const clickBtn = () => {
     text-align: center;
     position: relative;
 
-    img {
+    img :first-child {
         margin-top: 15px;
+        width: 250px;
+        height: 250px;
     }
 
     .mark {

+ 13 - 6
vue.config.js

@@ -1,6 +1,6 @@
 const path = require('path')
 const fs = require('fs')
-
+const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
 // webpack.config.js
 const AutoImport = require('unplugin-auto-import/webpack')
 const Components = require('unplugin-vue-components/webpack')
@@ -8,6 +8,7 @@ const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
 const CopyWebpackPlugin = require('copy-webpack-plugin');
 
 
+
 // Generate pages object
 const pages = {}
 
@@ -76,14 +77,20 @@ module.exports = {
     resolve: {
       alias: {
         '@': path.resolve('src')
+      },
+      fallback: {
+        fs: false
       }
     },
+
+
     output: {
       filename: `js/[name].js`,
       chunkFilename: `[name].js`
     },
     devtool: isDevMode ? 'inline-source-map' : false,
     plugins: [
+      new NodePolyfillPlugin(),
       AutoImport({
         resolvers: [ElementPlusResolver()],
       }),
@@ -109,9 +116,9 @@ module.exports = {
     ],
   },
   // 配置 content.css
-	css: {
-		extract: {
-			filename: "css/[name].css"
-		}
-	}
+  css: {
+    extract: {
+      filename: "css/[name].css"
+    }
+  }
 }