[-] god@sh.itjust.works 4 points 1 year ago
[-] god@sh.itjust.works -5 points 1 year ago

Whatabboutism at its best. Lovely

[-] god@sh.itjust.works 15 points 1 year ago

Why would we want to?

[-] god@sh.itjust.works 2 points 1 year ago* (last edited 1 year ago)

These trains will be free for all passengers. And probably paid by the company

[-] god@sh.itjust.works 5 points 1 year ago

You don't tell them.

[-] god@sh.itjust.works -4 points 1 year ago

You may have not read much.

[-] god@sh.itjust.works 0 points 1 year ago

Do check if all files are synced. Years ago I tried sync and I lost all my pdfs. Only mds and images were shared.

[-] god@sh.itjust.works 4 points 1 year ago* (last edited 1 year ago)

Containers addon. And it has bookmarks decades old. Remove both and I wouldn't care much. I'm also more familiar with it. It feels more natural due to this. I feel more comfortable on it. More at home, less scared.

[-] god@sh.itjust.works 8 points 1 year ago

Except for me ๐Ÿ˜Ž I am cringe

2

cross-posted from: https://sh.itjust.works/post/518117

I'm creating this community as a place for discussion around the upcoming Olympus for Lemmy iOS app. The TestFlight build is awaiting approval and should be available in the next 24 hours. In the meantime, here's a bit about the app and what to expect.

Motivation

I think a lot of us have an alien shaped hole in our chest that needs filling. I, like many of you, was not satisfied with the quality of many of the apps available for browsing lemmy. I got spoiled with Apollo and couldn't stand to settle, so I set out to build a similar experience for the Fediverse. While I've taken a lot of inspiration from Apollo, Olympus is by no means meant to be a direct clone.

Goal

I want to create a browsing experience that can be customized in every conceivable way. From visual personalization to content filtering, you will be able to change as much as is feasible about the app. A lot of the groundwork for this customization has been laid, but the settings are not yet user-accessible. In other words, the backed work is done but the frontend work is not(:

Where you come in

As early adopters and alpha testers, you all will play a pivotal role in the development of the app. Whatever you want, I'll do it. Just ask. I have an issue tracker set up on GitHub here, please stop by and drop any issues you face in there, or just make a post here. I'd prefer if we keep feature requests in this community and out of the issue tracker, but I won't be mad if you drop some in there too.

So that about sums it up I think. I'll keep you guys posted on new releases and will engage with you all in the comments.

  • Joe
31
submitted 1 year ago* (last edited 1 year ago) by god@sh.itjust.works to c/lemmy@lemmy.ml

How to use:

The url must be the hostname only, NO SLASHES, like this: lemmy.dbzer0.com, don't use https://, don't append a slash afterwards (lemmy.dbzer0.com/), only the hostname including the subdomain if it has it (in this case, lemmy).

If the instance has blocked the IP address from the server, or it is stuck and its API is not working correctly, it returns "Not a Lemmy instance" (I am too busy to fix this right now).

If the url is not formatted in a way it can process it, it will say Invalid URL. Better processing can come in the future. I won't be updating it now.

In the backend, it just scrapes https://fba.ryona.agency/?domain={url} and uses the api https://{instance}/api/v3/federated_instances

PRs welcome.

Honestly it works better when deployed locally in a development environment. I think Vercel's IP address is just blocked by cloudflare and other blacklists that stop automated stuff? Idk. Can check back in a few days.

441
submitted 1 year ago by god@sh.itjust.works to c/memes@lemmy.ml
3

The drop pod is what you use to drop from the space rig into the planet Hoxxes to start a mission, and you also use it to fly back up to the space rig with your loot.

51
owo (i.ibb.co)
submitted 1 year ago by god@sh.itjust.works to c/memes@lemmy.ml
25
anon goes to america (sh.itjust.works)
submitted 1 year ago by god@sh.itjust.works to c/greentext@lemmy.ml
1
gooboy rule (sh.itjust.works)
submitted 1 year ago by god@sh.itjust.works to c/196@lemmy.world
7
sms (sh.itjust.works)
submitted 1 year ago by god@sh.itjust.works to c/196@lemmy.world
2
intrusive thoughts rule (sh.itjust.works)
submitted 1 year ago by god@sh.itjust.works to c/196@lemmy.world
4
submitted 1 year ago by god@sh.itjust.works to c/asklemmy@lemmy.ml

I find that Hot and Active give you really old stuff, at least on my instance, that's like 3-7 days old stuff. New is just new, you know new, no community-assured quality. Top is stuff I've already seen. Where do I get a better feed? Can we have like Top 7 hours? Or a mixture of "top 16 hours" and "active"?

What do you do when browsing Lemmy? What are some of your strategies to get good shit while being here? Cuz so far if I try and use the front pages I get bored to shit.

The way I get anything barely worth interacting with from the front page is New Comments. Not the best, but better than the other options I discussed.

That or just, instead of interacting with a lot of stuff, interacting deeply with the few things I find that I like.

6
10
submitted 1 year ago* (last edited 1 year ago) by god@sh.itjust.works to c/plugins@sh.itjust.works

Wanted to do this for a while. Did it today instead of sleeping.

Screenshot:

You can install it from here: https://greasyfork.org/en/scripts/468948-user-details-on-hover

Link to GitHub repo: https://github.com/lemmygod/lemmy-hovercards/tree/main

Or you can copy-paste the following code:

::: spoiler click here to view code.

// ==UserScript==
// @name         User Details on Hover
// @namespace    http://tampermonkey.net/
// @version      0.12
// @description  Show user details on hover
// @author       You
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function () {
  "use strict";
  const isLemmy =
    document.head.querySelector("[name~=Description][content]").content ===
    "Lemmy";
  if (!isLemmy) return;
  // Inject styles for the user card
  function main() {
    const style = document.createElement("style");
    style.innerHTML = `
  .user-card {
    position: absolute;
    display: none;
    width: 350px;
    background-color: #242424;
    color: white;
    padding: 15px;
    border-radius: 10px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
    z-index: 1000;
    grid-gap: 10px;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    line-height: 1.4;
  }

  .user-card .header {
    display: flex;
    align-items: center;
    margin-bottom: 10px;
  }

  .user-card img {
    width: 80px;
    height: 80px;
    object-fit: cover;
    border-radius: 50%;
    margin-right: 15px;
  }

  .user-card .username {
    font-size: 1.3em;
    font-weight: bold;
  }

  .user-card .instance {
    font-size: 0.8em;
    color: #888;
  }

  .user-card .body {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-gap: 10px;
  }

  .user-card .key {
    font-weight: bold;
  }

  .user-card .value {
    color: #ddd;
    margin-top: 10px;
  }

  .user-card .bio {
    grid-column: 1 / -1;
    font-style: italic;
  }`;
    document.head.appendChild(style);

    // Create the user card
    const userCard = document.createElement("div");
    userCard.classList.add("user-card");
    userCard.id = "user-card";
    document.body.appendChild(userCard);

    let timer;
    // Find all user links
    const userLinks = document.querySelectorAll('a.text-info[href*="/u/"]');
    userLinks.forEach((userLink) => {
      userLink.setAttribute("title", "");
      // When mouse enters, show the user card
      userLink.addEventListener("mouseenter", async (event) => {
        const username = userLink.href.split("/u/")[1];

        // Fetch user details
        const userInfo = await getUserInfo(username);

        // Format the date
        const date = new Date(userInfo.creationDate);
        const formattedDate = `${date.getFullYear()}/${String(
          date.getMonth() + 1
        ).padStart(2, "0")}/${String(date.getDate()).padStart(2, "0")}`;

        // Update the user card
        userCard.innerHTML = `
              <div class="header">
                  <img src="${
                    userInfo.profilePicture ||
                    `https://api.dicebear.com/6.x/identicon/svg?seed=${username}`
                  }" alt="User avatar">
                  <div>
                      <div class="username">${
                        userInfo.name || username.split("@")[0]
                      }</div>
                      <a href="https://${
                        userInfo.instance
                      }/u/${username}" class="instance">${username}${
          username.indexOf("@") === -1 ? "@" + userInfo.instance : ""
        }
                      </a>
                  </div>
              </div>
              <div class="body">
                  <div><span class="key">ID:</span> <span class="value">${
                    userInfo.id
                  }</span></div>
                  <div style="display:flex; flex-direction: column; gap: 3px"><span class="key">
                    <svg class="icon"><use xlink:href="/static/assets/symbols.svg#icon-cake"></use><div class="sr-only"><title>cake</title></div></svg>
                    Cake Day:</span> <span class="value">${formattedDate}</span></div>
                  <div><span class="key">Posts:</span> <span class="value">${
                    userInfo.post_count
                  }</span></div>
                  <div><span class="key">Comments:</span> <span class="value">${
                    userInfo.comment_count
                  }</span></div>
                  <div><span class="key">Post Score:</span> <span class="value">${
                    userInfo.post_score
                  }</span></div>
                  <div><span class="key">Comment Score:</span> <span class="value">${
                    userInfo.comment_score
                  }</span></div>
                  ${
                    userInfo.bio ? `<div class="bio">${userInfo.bio}</div>` : ""
                  }
              </div>`;

        // Show the user card at the cursor
        const rect = userLink.getBoundingClientRect();
        userCard.style.left = `${window.pageXOffset + rect.left}px`;
        userCard.style.top = `${window.pageYOffset + rect.bottom + 5}px`;
        // setTimeout(() => {
        if (userLink.querySelector(":hover")) {
          userCard.style.display = "block";
        }
        // }, 250);
        timer = setTimeout(() => {
          // check if username is not being hovered anymore after 150ms, after which point we must change display to none
          if (!userLink.querySelector(":hover")) {
            userCard.style.display = "none";
          }
        }, 150);
      });

      // When mouse leaves, hide the user card after a slight delay
      userLink.addEventListener("mouseleave", () => {
        // after a slight delay, delete the node
        timer = setTimeout(() => {
          // delete the node
          // userCard.parentElement.removeChild(userCard);
          userCard.style.display = "none";
        }, 250);
        setTimeout(() => {
          // check if both are unhovered after 260ms, and if that's the case, removeChild anyway
          if (!userCard.parentElement) return;
          if (!userCard.querySelector(":hover")) {
            // userCard.parentElement.removeChild(userCard);
            userCard.style.display = "none";
          }
        }, 250);

        // timer = setTimeout(() => {
        //   userCard.style.display = "none";
        // }, 250);
      });
    });

    userCard.addEventListener("mouseenter", () => {
      clearTimeout(timer);
    });

    userCard.addEventListener("mouseleave", () => {
      userCard.style.display = "none";
      // userCard.parentElement.removeChild(userCard);
    });

    // Fetch user info from the API
    async function getUserInfo(userName) {
      const instanceName = location.href.split("/")[2];
      const response = await fetch(
        `https://${instanceName}/api/v3/user?username=${userName}`,
        {
          method: "GET",
          headers: {
            "Content-Type": "application/json",
          },
        }
      );
      const user = await response.json();
      const {
        published: creationDate,
        avatar: profilePicture,
        bio,
        display_name: name,
        name: username,
        id,
        banner,
      } = user.person_view.person;
      const { comment_count, comment_score, post_count, post_score } =
        user.person_view.counts;

      return {
        creationDate,
        profilePicture,
        bio,
        name,
        username,
        id,
        banner,
        instance: instanceName,
        comment_count,
        comment_score,
        post_count,
        post_score,
      };
    }
  }

  // detect react changed url but didn't reload the page by checking for url change
  var oldHref = document.location.href;
  setInterval(function () {
    if (document.location.href !== oldHref) {
      oldHref = document.location.href;
      // Wait for the page to load
      setTimeout(main, 1000);
      console.log("url changed!");
    }
  }, 500);

  // run on page load
  main();
})();
view more: next โ€บ

god

joined 1 year ago
MODERATOR OF