|
57 | 57 | });
|
58 | 58 | }
|
59 | 59 |
|
| 60 | + function parse30066(event) { |
| 61 | + const parsedTags = {}; |
| 62 | + const url = event.tags.filter( tag => tag[0] == 'd')?.[0]?.[1] |
| 63 | + if(!url) return { error: "no d tag?" } |
| 64 | + const tags = event.tags.filter( tag => tag.length >= 3) |
| 65 | + tags.forEach(tag => { |
| 66 | + const [key, subkey, ...values] = tag; |
| 67 | + if (!parsedTags[key]) { |
| 68 | + parsedTags[key] = {}; |
| 69 | + } |
| 70 | + if (!parsedTags[key][subkey]) { |
| 71 | + parsedTags[key][subkey] = values.length > 1 ? values.map(v => castValue(v)) : castValue(values[0]); |
| 72 | + } |
| 73 | + else { |
| 74 | + if (Array.isArray(parsedTags[key][subkey])) { |
| 75 | + parsedTags[key][subkey] = [...parsedTags[key][subkey], ...values.map(v => castValue(v))]; |
| 76 | + } |
| 77 | + else { |
| 78 | + parsedTags[key][subkey] = [parsedTags[key][subkey], ...values.map(v => castValue(v))]; |
| 79 | + } |
| 80 | + } |
| 81 | + }); |
| 82 | + if(!parsedTags?.rtt?.open) return { error: "no rtt connect tag?", tags: tags } |
| 83 | + return { url, ...parsedTags}; |
| 84 | + } |
| 85 | +
|
| 86 | + function castValue(value) { |
| 87 | + // Check for boolean strings |
| 88 | + if (value.toLowerCase() === 'true') return true; |
| 89 | + if (value.toLowerCase() === 'false') return false; |
| 90 | + |
| 91 | + // Check for IPv4 addresses or similar patterns that should not be converted |
| 92 | + const ipv4Regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/; |
| 93 | + if (ipv4Regex.test(value)) return value; |
| 94 | +
|
| 95 | + // Additional check for geohash-like patterns (alphanumeric strings) |
| 96 | + // This regex matches strings that contain both letters and numbers, indicative of a geohash |
| 97 | + const geohashRegex = /^[0-9a-zA-Z]+$/; |
| 98 | + if (geohashRegex.test(value) && /[a-zA-Z]/.test(value) && /[0-9]/.test(value)) return value; |
| 99 | +
|
| 100 | + // Attempt to parse as a float |
| 101 | + const asFloat = parseFloat(value); |
| 102 | + if (!isNaN(asFloat) && isFinite(asFloat) && String(asFloat) === value) { |
| 103 | + return asFloat; |
| 104 | + } |
| 105 | +
|
| 106 | + // Return the original value if none of the above conditions are met |
| 107 | + return value; |
| 108 | + } |
| 109 | +
|
60 | 110 | const connect = async () => {
|
61 | 111 | const relay = await Relay.connect('wss://history.nostr.watch').catch(connect);
|
62 | 112 | relay.subscribe(
|
|
111 | 161 |
|
112 | 162 | function calculateDimensions(event) {
|
113 | 163 | // Default dimension and RTT scaling factor
|
114 |
| - const defaultDimension = 50; // Base size of the block |
| 164 | + const defaultDimension = 150; // Base size of the block |
115 | 165 | const rttScalingFactor = 0.05; // Determines how much RTT affects the size
|
116 | 166 |
|
| 167 | + // Max RTT value for scaling |
| 168 | + const maxRTT = 10000; // Example max value, adjust based on expected RTT range |
| 169 | +
|
117 | 170 | // Check if the event has RTT data
|
118 | 171 | if (event.tags && Array.isArray(event.tags)) {
|
119 |
| - const rttValues = event.tags.filter(tag => tag[0] === 'rtt').map(tag => parseInt(tag[2], 10)); |
120 |
| - const totalRTT = rttValues.reduce((acc, rtt) => acc + rtt, 0); |
121 |
| - return defaultDimension + (totalRTT * rttScalingFactor); |
| 172 | + const rttValues = event.tags.filter(tag => tag[0] === 'rtt').map(tag => parseInt(tag[2], 10)); |
| 173 | + const totalRTT = rttValues.reduce((acc, rtt) => acc + rtt, 0); |
| 174 | + |
| 175 | + // Calculate the scaled dimension inversely related to RTT |
| 176 | + // Ensure that the totalRTT does not exceed maxRTT for calculation purposes |
| 177 | + const effectiveRTT = Math.min(totalRTT, maxRTT); |
| 178 | + |
| 179 | + // Adjust the dimension based on RTT, making higher RTT result in smaller dimensions |
| 180 | + return defaultDimension - Math.min(effectiveRTT * rttScalingFactor, defaultDimension - 1); |
122 | 181 | } else {
|
123 |
| - return defaultDimension; |
| 182 | + return defaultDimension; |
124 | 183 | }
|
125 |
| - } |
| 184 | +} |
| 185 | +
|
| 186 | + // function calculateDimensions(event) { |
| 187 | + // // Default dimension and RTT scaling factor |
| 188 | + // const defaultDimension = 50; // Base size of the block |
| 189 | + // const rttScalingFactor = 0.05; // Determines how much RTT affects the size |
| 190 | +
|
| 191 | + // // Check if the event has RTT data |
| 192 | + // if (event.tags && Array.isArray(event.tags)) { |
| 193 | + // const rttValues = event.tags.filter(tag => tag[0] === 'rtt').map(tag => parseInt(tag[2], 10)); |
| 194 | + // const totalRTT = rttValues.reduce((acc, rtt) => acc + rtt, 0); |
| 195 | + // return defaultDimension + (totalRTT * rttScalingFactor); |
| 196 | + // } else { |
| 197 | + // return defaultDimension; |
| 198 | + // } |
| 199 | + // } |
126 | 200 |
|
127 | 201 | function generateSaturatedColorFromTag(str) {
|
128 | 202 | let hash = 0;
|
|
170 | 244 | return color;
|
171 | 245 | }
|
172 | 246 |
|
173 |
| -function parse30066(event) { |
174 |
| - const parsedTags = {}; |
175 |
| - const url = event.tags.filter( tag => tag[0] == 'd')?.[0]?.[1] |
176 |
| - if(!url) return { error: "no d tag?" } |
177 |
| - const tags = event.tags.filter( tag => tag.length >= 3) |
178 |
| - tags.forEach(tag => { |
179 |
| - const [key, subkey, ...values] = tag; |
180 |
| - if (!parsedTags[key]) { |
181 |
| - parsedTags[key] = {}; |
182 |
| - } |
183 |
| - if (!parsedTags[key][subkey]) { |
184 |
| - parsedTags[key][subkey] = values.length > 1 ? values.map(v => castValue(v)) : castValue(values[0]); |
185 |
| - } |
186 |
| - else { |
187 |
| - if (Array.isArray(parsedTags[key][subkey])) { |
188 |
| - parsedTags[key][subkey] = [...parsedTags[key][subkey], ...values.map(v => castValue(v))]; |
189 |
| - } |
190 |
| - else { |
191 |
| - parsedTags[key][subkey] = [parsedTags[key][subkey], ...values.map(v => castValue(v))]; |
192 |
| - } |
193 |
| - } |
194 |
| - }); |
195 |
| - if(!parsedTags?.rtt?.open) return { error: "no rtt connect tag?", tags: tags } |
196 |
| - return { url, ...parsedTags}; |
197 |
| -} |
198 |
| -
|
199 |
| -function castValue(value) { |
200 |
| - // Check for boolean strings |
201 |
| - if (value.toLowerCase() === 'true') return true; |
202 |
| - if (value.toLowerCase() === 'false') return false; |
203 |
| - |
204 |
| - // Check for IPv4 addresses or similar patterns that should not be converted |
205 |
| - const ipv4Regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/; |
206 |
| - if (ipv4Regex.test(value)) return value; |
207 |
| -
|
208 |
| - // Additional check for geohash-like patterns (alphanumeric strings) |
209 |
| - // This regex matches strings that contain both letters and numbers, indicative of a geohash |
210 |
| - const geohashRegex = /^[0-9a-zA-Z]+$/; |
211 |
| - if (geohashRegex.test(value) && /[a-zA-Z]/.test(value) && /[0-9]/.test(value)) return value; |
212 |
| -
|
213 |
| - // Attempt to parse as a float |
214 |
| - const asFloat = parseFloat(value); |
215 |
| - if (!isNaN(asFloat) && isFinite(asFloat) && String(asFloat) === value) { |
216 |
| - return asFloat; |
217 |
| - } |
218 | 247 |
|
219 |
| - // Return the original value if none of the above conditions are met |
220 |
| - return value; |
221 |
| -} |
222 | 248 |
|
223 | 249 |
|
224 | 250 |
|
|
0 commit comments