From 76f7e2d5ebda6c1165df0c20dee19ee81198ecb4 Mon Sep 17 00:00:00 2001 From: vicariousdrama Date: Fri, 28 Jul 2023 12:02:31 -0400 Subject: [PATCH] Difficulty Epoch block labels, improved greyscale --- CHANGELOG.md | 1 + images/difficultyepoch.png | Bin 18946 -> 21327 bytes scripts/difficultyepoch.py | 85 +++++++++++++++++++++++++++++++++---- 3 files changed, 77 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f373a..78492a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ title: NODEYEZ Change Log **New Panels and Ehancements** - Blockstats panels for feerates now reports the low value in addition to high and avg +- Difficulty Epoch panel now shows key block height labels and dithered outline for unexpected non-mined - Nostr.Band Stats panel graphs the Active Pubkeys, Badge Definitions and Zaps per Day seen over the previous 2 months **General** diff --git a/images/difficultyepoch.png b/images/difficultyepoch.png index 64ca78749a1c64526c182740f6aae5f0e829f37b..31fba2d8acaf337feeaf000660a1be450b0a5bde 100644 GIT binary patch literal 21327 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 Y+u3+*LL>)pQ6{1!uPm1@WBB5K0fk4O-T(jq literal 18946 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 epochBlocksExpected: - fillcolor = self.aheadColor - currentminedcolor = self.aheadColor + fillcolor = self.aheadColor # yellow + currentminedcolor = self.aheadColor # yellow + if blockBeingRendered > lastAheadBlock: + lastAheadX = tlx + lastAheadY = tly + lastAheadBlock = blockBeingRendered + else: + if blockBeingRendered > lastMinedBlock: + lastMinedX = tlx + lastMinedY = tly + lastMinedBlock = blockBeingRendered self.draw.rectangle(xy=((tlx,tly),(brx,bry)),fill=ImageColor.getrgb(fillcolor)) else: - outlinecolor = self.gridColor + outlinecolor = self.gridColor # grey if epochblocknum <= epochBlocksExpected: - outlinecolor = self.behindColor - currentminedcolor = self.behindColor - self.draw.rectangle(xy=((tlx,tly),(brx,bry)),fill=None,outline=ImageColor.getrgb(outlinecolor)) - # labels + outlinecolor = self.behindColor # red + currentminedcolor = self.behindColor # red + if blockBeingRendered > lastBehindBlock: + lastBehindX = tlx + lastBehindY = tly + lastBehindBlock = blockBeingRendered + self.draw.rectangle(xy=((tlx,tly),(brx,bry)),fill=None,outline=ImageColor.getrgb(outlinecolor)) + else: # dashed box + dllen = 2 + dslen = 1 + for dlx in range(tlx,brx,dllen): self.draw.line(xy=[(dlx,tly),(dlx+(dslen-1),tly)],fill=ImageColor.getrgb(outlinecolor),width=1) + for dly in range(tly,bry,dllen): self.draw.line(xy=[(brx,dly),(brx,dly+(dslen-1))],fill=ImageColor.getrgb(outlinecolor),width=1) + for dlx in range(brx,tlx,(-1*dllen)): self.draw.line(xy=[(dlx,bry),(dlx-(dslen-1),bry)],fill=ImageColor.getrgb(outlinecolor),width=1) + for dly in range(bry,tly,(-1*dllen)): self.draw.line(xy=[(tlx,dly),(tlx,dly-(dslen-1))],fill=ImageColor.getrgb(outlinecolor),width=1) + + # labels - key blocks + if lastMinedBlock > -1: + labelText = str(lastMinedBlock) + labelX = lastMinedX + if lastMinedY < (padtop + (2*blockw)): + minedAnchor = "tr" + labelY = lastMinedY + blockw + math.ceil(blockw/2) + if lastMinedX < 100: minedAnchor = "tl" + else: + minedAnchor = "br" + labelY = lastMinedY - math.ceil(blockw/2) + if lastMinedX < 100: minedAnchor = "bl" + vicarioustext.drawLabel(draw=self.draw,s=labelText,fontsize=10,anchorposition=minedAnchor,anchorx=labelX,anchory=labelY,textColor=self.minedColor) + if lastBehindBlock > -1: + labelText = str(lastBehindBlock) + labelX = lastBehindX + if lastBehindY > (padtop + ((gridRows-2)*blockw)): + behindAnchor = "bl" + labelY = lastBehindY - math.ceil(blockw/2) + if lastBehindX > self.width - 100: behindAnchor = "br" + else: + behindAnchor = "tl" + labelY = lastBehindY + blockw + math.ceil(blockw/2) + if lastBehindX > self.width - 100: behindAnchor = "tr" + if lastMinedY != lastBehindY or minedAnchor[:1] != behindAnchor[:1]: + vicarioustext.drawLabel(draw=self.draw,s=labelText,fontsize=10,anchorposition=behindAnchor,anchorx=labelX,anchory=labelY,textColor=self.behindColor) + if lastAheadBlock > -1: + labelText = str(lastAheadBlock) + labelX = lastAheadX + if lastAheadY > (padtop + ((gridRows-2)*blockw)): + aheadAnchor = "bl" + labelY = lastAheadY - math.ceil(blockw/2) + if lastAheadX > self.width - 100: aheadAnchor = "br" + else: + aheadAnchor = "tl" + labelY = lastAheadY + blockw + math.ceil(blockw/2) + if lastAheadX > self.width - 100: aheadAnchor = "tr" + if lastMinedY != lastAheadY or minedAnchor[:1] != aheadAnchor[:1]: + vicarioustext.drawLabel(draw=self.draw,s=labelText,fontsize=10,anchorposition=aheadAnchor,anchorx=labelX,anchory=labelY,textColor=self.aheadColor) + + # labels - general fs = int(self.height * (18/320)) # 18 default font size for 320 pixel high image labelHeight = int(fs * 1.40) col1X = int(self.width * .25)