Day12 - 搜寻文章作者及合并方法

今天做点简单的事情,先把搜寻作者的部份给加进来。

Layout也跟昨天一样先多加一行:
https://ithelp.ithome.com.tw/upload/images/20210926/201246024EEL0OxXeB.png

基本上前置作业都和Day11一样,差别只在於Ptt搜寻作者的按键是"a"。

searchAuthor

private suspend fun searchAuthor(author: String) {
    delay(200L)
    PttClient.getInstance().send("a$author\r\n")
    delay(200L)
    when (PttClient.getInstance().expect(searchTitleOrAuthorPattern)) {
        0 -> {
            //TODO show Alert
            Log.d(mTag, "Up to limit")
        }
        1 -> {
            parseBoardArticle(PttClient.getInstance().getScreen())
        }
        else -> {
            Log.e(
                mTag,
                "Wrong screen: \n${PttClient.getInstance().getScreen()}"
            )
            PttClient.getInstance().send("\r\nqqqqqqqqqqqq")
            //TODO show alert
        }
    }
}

可以看到内容也与搜寻标题重覆性很高,因此决定把两段的程序分别提取成searchDetailProcesssearchDetail两方法。

修改後的两个Button点击事件如下

searchTitle.setOnClickListener {
    val word = searchTitleInput.text.toString()
    if (word.isEmpty()) return@setOnClickListener
    searchTitleInput.setText("")

    searchDetailProcess("/$word\r\n")
}

searchAuthor.setOnClickListener {
    val author = searchAuthorInput.text.toString()
    if (author.isEmpty()) return@setOnClickListener
    searchAuthorInput.setText("")

    searchDetailProcess("a$author\r\n")
}

差别只在於将不同的command送入。

searchDetailProcess

private fun searchDetailProcess(command:String) {
    when (PttClient.getInstance().expect(inBoardPattern)) {
        0 -> {
            // first go into the board
            val board = searchBoardInput.text.toString().trim()
            if (board.isEmpty()) return
            PttClient.getInstance().send("s${board}\r\n")
            viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
                delay(200L)
                var ret = PttClient.getInstance().expect(inBoardPattern)
                while (ret == 1) {
                    if (ret == 1) {
                        PttClient.getInstance().send("q")
                        delay(200L)
                        ret = PttClient.getInstance().expect(inBoardPattern)
                    }
                }
                when (ret) {
                    0 -> { // "【主功能表】" -> 在看板外,无法搜寻文章
                        Log.e(mTag, "Out of board.\n${PttClient.getInstance().getScreen()}")
                        return@launch
                    }
                    2 -> { // "文章选读" -> 在看板内
                        searchDetail(command)
                    }
                }
            }
        }
        2 -> {
            viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
                searchDetail(command)
            }
        }
        else -> {
            Log.e(mTag, "Wrong screen: \n${PttClient.getInstance().getScreen()}")
            PttClient.getInstance().send("\r\nqqqqqqqqqqqq")
            //TODO show alert
        }
    }
}

searchDetail

private suspend fun searchDetail(command: String) {
    delay(200L)
    PttClient.getInstance().send(command)
    delay(200L)
    when (PttClient.getInstance().expect(searchTitleOrAuthorPattern)) {
        0 -> {
            //TODO show Alert
            Log.d(mTag, "Up to limit")
        }
        1 -> {
            parseBoardArticle(PttClient.getInstance().getScreen())
        }
        else -> {
            Log.e(
                mTag,
                "Wrong screen: \n${PttClient.getInstance().getScreen()}"
            )
            PttClient.getInstance().send("\r\nqqqqqqqqqqqq")
            //TODO show alert
        }
    }
}

两方法的内容都和Day11一致。

目前进度先到这边,明天预计就是parseBoardArticle的内容了。


<<:  Day-15 RAID

>>:  Day 15. 模板语法Template Syntax – 指令

[Day 23] placeholder

写在前面 placeholder for test placeholder for test pla...

Day 11 漏洞分析 - Vulnerability Analysis (nikto)

经过连续十天的收集情报,体验了各式工具,可以发现前面介绍的大部分工具都是单纯的收集情报,少部分则可以...

Day34:HTML(31) HTML响应式网页设计(1)

设置视口 要创建响应式网站,请在"meta" 您的所有网页上添加以下标记 响应式...

React状态计算解密

点击进入React源码调试仓库。 概述 壹旦用户的交互产生了更新,那麽就会产生壹个update对象去...

前言 | ML#Day1

AI和资料科学在最近几年是非常火红的话题,日常已经可以随处可见各种广告或者企业将AI挂在嘴边,声称其...